|
|
|
|
Bonjour,
Je souhaite lire un fichier texte pour le réécrire différemment dans un autre fichier texte.
Je crée une en-tête manuellement dans le second fichier (celui où je dois écrire)
Je veux donc commencer à écrire dans ce second fichier juste après ce que j'ai déjà écris.
Pour ça, je me place à la fin du fichier de la façon suivante:
while(!feof(f_F1_inp))
{
fscanf(f_F1_inp,"%s");
}
Ensuite, je rempli mon deuxième fichier texte de la façon suivante:
while(!feof(f_F1_txt))
{
fscanf(f_F1_txt,"%s",s_tmp_F1);
fprintf(f_F1_inp,"%s%s"," ",s_tmp_F1);
}
Tout ça marche très bien...
Le problème, c'est que dans le même main(), je voudrais faire la même chose avec deux autres fichiers qui ont exactement les mêmes formes et qui au lieu de s'appeler "F1" s'appellent "E1". Je fais donc un copier coller de mon code et je change F1 en E1 et il arrive toujours à me faire F1 mais pas E1.
J'essaye donc d'inverser les deux parties de codes et cette fois, il arrive à faire E1 et pas F1...
J'ai réussi un peu à isoler le problème et je trouve qu'il est au niveau du fscanf qui ne veux pas se faire une deuxième fois sur un autre fichier!!!!!!!!!!!!!
Est ce que quelqu'un peut m'éclairer là dessus?
Pour info, je vous met le code complet (c'est peut être plus simple après ces applications:
////////////// matrice F1///////////////
// ouverture du fichier à lire
FILE * f_F1_txt;
f_F1_txt=fopen("mat_F1.txt","r");
rewind(f_F1_txt);
//ouverture du fichier .inp
FILE * f_F1_inp;
f_F1_inp=fopen("F1.inp","r+");
rewind(f_F1_inp);
// je place le curseur à la fin du fichier
while(!feof(f_F1_inp))
{
fscanf(f_F1_inp,"%s");
}
//remplissage
char s_tmp_F1[256];
while(!feof(f_F1_txt))
{
fscanf(f_F1_txt,"%s",s_tmp_F1);
fprintf(f_F1_inp,"%s%s"," ",s_tmp_F1);
}
fclose(f_F1_txt);
fclose(f_F1_inp);
////////////// matrice E1///////////////
// ouverture du fichier à lire
FILE * f_E1_txt;
f_E1_txt=fopen("mat_E1.txt","r");
rewind(f_E1_txt);
//ouverture du fichier .inp
FILE *f_E1_inp;
f_E1_inp=fopen("E1.inp","r+");
rewind(f_E1_inp);
// je place le curseur à la fin du fichier
while(!feof(f_E1_inp))
{
fscanf(f_E1_inp,"%s"); //////////////c'est ici que ça ne marche plus....////////////////////
}
//remplissage
char s_tmp_E1[256];
while(!feof(f_E1_txt))
{
fscanf(f_E1_txt,"%s",s_tmp_E1);
fprintf(f_E1_inp,"%s%s"," ",s_tmp_E1);
}
fclose(f_E1_txt);
fclose(f_E1_inp);
Configuration: Windows XP Safari 525.19
Comme personne ne répond, je vais m'y coller; mais il eût été préférable que ce fût fiffy qui s'y connait beaucoup mieux que moi; il t'aurait d'ailleurs conseillé de ne pas utiliser 'scanf' qui a un comportement parfois surprenant mais plutôt une fonction du style 'gets' ou plutôt dans ton cas 'fgets'.
|
Salut,
fscanf(f_F1_inp,"%s"); Il n'y a pas de chaîne spécifiée correspondant au %s. Du coup, le compilateur va prendre la première variable suivante se trouvant dans la pile. Bref, un comportement "difficile" à prévoir. Ce qui peut conduire à des cas bizarres comme dans ton exemple ;) Pour résoudre cela, il te suffit de spécifier l'argument : char toto[256]; fscanf(f_F1_inp,"%s",toto);. Sinon, une petite remarque sur ton code. Tu utilises rewind pour remettre l'indicateur de flux en début de fichier. Mais ceci est inutile étant donné que tu utilises le mode r et r+ qui te garantissent déjà que le pointeur de flux sera en début. Lorsque tu souhaites mettre le pointeur de flux en fin de fichier, plutôt que d'utiliser fscanf en boucle, tu peux utiliser : fseek(fichier,0,SEEK_END); Ou pourquoi pas utiliser tout simplement le mode "a" de fopen() qui te placera directement le flux en fin de fichier. Ce qui t'évitera d'utiliser ton rewind, et ta boucle while contenant ton fscanf. Et enfin, comme te l'a dit loupius, attention à l'utilisation de scanf qui est très complexe et peut vite devenir dangereux sans précaution particulière. Imagine par exemple que ton fichier contienne une ligne de plus de 260 caractères. Bug assuré. A la place, tu peux utiliser fgets (et non gets) comme l'a souligné si justement loupius. Cdlt Google is your friend |
Bonjour
|