Problème fscanf c++

Résolu/Fermé
ptit81 Messages postés 29 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 6 décembre 2012 - 23 févr. 2009 à 17:10
ptit81 Messages postés 29 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 6 décembre 2012 - 24 févr. 2009 à 12:49
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);

4 réponses

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'.
Dans la ligne suivante:
fscanf(f_E1_inp,"%s"); //////////////c'est ici que ça ne marche plus....////////////////////
le compilateur, s'il est bien réglé, doit râler et cela devrait te mettre la puce à l'oreille... il y a bien une chaîne de format avec un %s, mais... rien ne correspond au '%s'.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 févr. 2009 à 00:59
Salut,
Effectivement, loupius a mis le doigt sur le problème.
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
0
ptit81 Messages postés 29 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 6 décembre 2012 2
24 févr. 2009 à 08:46
Bonjour

Merci beaucoup pour tous vos conseils.

En effet, le compilateur galérait pas mal... Maintenant, c'est très rapide en utilisant fseek(fichier,0,SEEK_END); et le code tourne bien.
Par contre, j'utilise toujours le fscanf pour la partie lecture du fichier car j'ai un problème dans l'utilisation du fgets où je dois spécifier le nombre de terme à garder à chaque fois alors que ce qui me plaisait dans le fscanf, c'était le fait qu'il prenne les termes un par un sans se soucier de leur taille en s'arrêtant quand il y avait un blanc.
Est ce qu'on peut faire la même chose avec le fgets?

Merci d'avance
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
24 févr. 2009 à 11:59
Non, on ne peut pas faire la même chose avec le fgets.
Dans ce cas, spécifie la taille avec le fscanf.
Par exemple :
char buffer[256]; fscanf(fichier,"%255s",buffer);

Cela t'évitera de joli segfault en cas de lignes trop longues dans ton fichier ;)
0
ptit81 Messages postés 29 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 6 décembre 2012 2
24 févr. 2009 à 12:49
Merci beaucoup pour votre aide précieuse à tous les deux.

Cordialement

pitit
0