De fichier à tableau de structure et de tableau de structure à fichier

Salut,

J’ai 2 problemes qui sont à peu près liè

en gros j’ai un fichier (auto.txt) qui regroupe des info sur des voitures …

extrait de auto.txt :
406 peugeot diesel coupe
206 peugeot essence cabriolet

probleme 1 :

je souhaite ajouter une voiture dans mon fichier

voila ce que j’ai fait :

struct voiture
{
char numero[20];
char marque[100];
char moteur[100];
char type[100];
};

void ajout(void) {

FILE *fichier;
struct voiture veh;

fichier = fopen(repertoire,"a");
printf("entrer le numero :\n");
scanf("%s",veh.numero);
printf("entrer la marque:\n");
scanf("%s",veh.marque);
printf("entrer le moteur:\n");
scanf("%s",veh.moteur);
printf("entrer le type:\n");
scanf("%s",veh.type);
fprintf(fichier,"%s %s %s %s\n",veh.numero,veh.marque, veh.moteur, veh.type);

fclose(fichier);

}

alors ca marche mais je me demande s’il y pas mieux …

probleme 2 :

meme fichier, meme structure mais la je souhaite lire les info de mon fichier et les remplir dans un tableau de struct

et la je bloque …
j’ai ouvert le fichier en lecture je parcours chaque ligne mais je vois pas comment remplir le tableau

merci de m’aider
++

voir la doc sur le fscanf()
ou sinon tu li une ligne et apres chaque espace tu rempli un nouveau champ de ta structure.

fais un fichier csv avec separateur ;

406;peugeot;diesel;coupe
206;peugeot;essence;cabriolet

pour le lire

[cpp]
char buffer[1025];
struct voiture … mabagnole;

while(fgets(buffer,1024,fichier))
{
i=0;
while(buffer[i]!=’;’)i++;
strncpy(mabagnole.marque,buffer,i);

}
[/cpp]

ps : forza NICE

oki …

et je repete :

i=0;

while(buffer[i]!=’;’)i++;

strncpy(mabagnole.marque,buffer,i);

autant de fois qu’il y a de champs.

ps : ils commencent à me les briser menu ces Niçois, ils perdent contre tous le monde et contre Monaco ils se reveillent, mais pourquoi sont ils si mechant ?

tu repete pas exactement

faut mettre un j=i; avant
et ensuite

i++;j=i;
while(buffer[i]!=’;’&&buffer[i]!=’\n’&&buffer[i]!=0)i++;
strncpy(mabagnole.monchamp,buffer+j,i);

sinon ça copie depui le debut

buffer[i]!=’;’ c pour continué tant qu’il ne rencontre par un ‘;’
buffer[i]!=’\n’ c pour continué tant qu’il ne rencontre pas un saut de ligne

et pourquoi mettre la condition " buffer[i]!=0 " ?

buffer[i]!=0

because normalement la chaine se termine par ‘\n’ avec un fgets mais si la derniere ligne ne fini pas par ‘\n’ tu va boguer :slight_smile:

oki

maintenant quand je teste, ca enregistre correctement au debut puis ca deconne

exemple :

406 peugeot;die ;coupe;diesel
;diesel;coupe

206 peugeot;ess ;cabriolet;essence
;essence;cabriolet

c lors de la copie que c’a deconne ?
j’ai testé en changeant la place du debut et de fin de copie et c’est pas mieux…

extrait du code :

while(fgets(buffer,1024,fichier)) {
i=0;
while(buffer[i]!=’;’&& buffer[i]!=’\n’&& buffer[i]!=0)
i++;
strncpy(voiture[p].numero,buffer,i);
//test pour voir ce qui a été enregistré
printf("%s “,voiture[p].numero);
i++;
j=i;
while(buffer[i]!=’;’&& buffer[i]!=’\n’&& buffer[i]!=0)
i++;
strncpy(voiture[p].marque,buffer+j,i);
printf(”%s “,voiture[p].marque);
i++;
j=i;
while(buffer[i]!=’;’&& buffer[i]!=’\n’&& buffer[i]!=0)
i++;
strncpy(voiture[p].moteur,buffer+j,i);
printf(”%s “,voiture[p].moteur);
i++;
j=i;
while(buffer[i]!=’;’&& buffer[i]!=’\n’&& buffer[i]!=0)
i++;
strncpy(voiture[p].type,buffer+j,i);
printf(”%s",voiture[p].type);
p++;
}

c bon j’ai trouvé
pour ceux que ca peut interréssé :
il s’agit de la position de copie qu’il fallait modifié.
en effet il faut retire j de la position de copie sinon ca recopie le j+i element d’apres

donc remplacer
strncpy(voiture[p].type,buffer+j,i); par
strncpy(voiture[p].type,buffer+j,i-j);

bon debug :wink:

c une question ça ?

:jap:
dsl j’ai cliqué trop vite (message édité)

j’ai une autre question …
quand j’ajoute un element dans un fichier je fais ca :

fichier = fopen(repertoire,"a");
printf("entrer le numero :\n");
scanf("%s",voit.num);
printf("entrer la marque:\n");
//scanf("%s",voit.marque);
    gets(temp);
    gets(voiture.marque);
printf("entrer le type\n");
scanf("%s",voit.type);
fprintf(fichier,"%s;%s;%s\n",voit.num,voit.marque,voit.type);

au depart j’utilise un scanf pour entrer voit.marque ce qui marche tres bien …
ensuite afin de pouvoir entrer des chaines avec espaces j’utilise un gets mais il ne veut pas saisir la chaine (il passe à l’instruction suivante)
j’utilise alors un gets(chainetemporaire) qu’il ignore et il veut bien me prendre mon gets(voiture.marque)
pourquoi ne prend il pas directement un gets ?
y a t’il une solution pour qu’il le fasse ?