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
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
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'.
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'.
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
24 févr. 2009 à 00:59
Salut,
Effectivement, loupius a mis le doigt sur le problème.
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 :
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 :
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
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
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
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
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
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
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 :
Cela t'évitera de joli segfault en cas de lignes trop longues dans ton fichier ;)
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 ;)
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
24 févr. 2009 à 12:49
Merci beaucoup pour votre aide précieuse à tous les deux.
Cordialement
pitit
Cordialement
pitit