fscanf, je comprends pas !
Le
Zouplaz
Bonjour j'ai un petit problème : je cherche à lire la première ligne d'un
fichier texte.
Le fichier s.ani contient donc
8
Je précise : un HUIT, suivi d'un retour chariot, suivi d'un deuxième retour
chariot (un fichier texte contenant la valeur 8 sur la première ligne quoi)
Et je fais ceci pour lire cette ligne :
bool lire()
{
FILE* file;
unsigned int delay;
file = fopen("s.ani","r");
if(file == NULL)
return false;
fscanf(file,"%d",&delay);
fclose(file);
return true;
}
Et bien, j'ai beau faire, la variable &delay contient n'importe quoi !
Pire, mes autres variables locales sont partiellement endommagées lors du
fscanf.
Que dois-je faire ?
Merci
fichier texte.
Le fichier s.ani contient donc
8
Je précise : un HUIT, suivi d'un retour chariot, suivi d'un deuxième retour
chariot (un fichier texte contenant la valeur 8 sur la première ligne quoi)
Et je fais ceci pour lire cette ligne :
bool lire()
{
FILE* file;
unsigned int delay;
file = fopen("s.ani","r");
if(file == NULL)
return false;
fscanf(file,"%d",&delay);
fclose(file);
return true;
}
Et bien, j'ai beau faire, la variable &delay contient n'importe quoi !
Pire, mes autres variables locales sont partiellement endommagées lors du
fscanf.
Que dois-je faire ?
Merci

Poser une question


Tu es sur pour les retours chariot ? tu bosses sur mac ?
parce que sous Unix, ton fichier va plutot contenir des linefeeds, et
sous windows, des combinaisons line-feed+retour chariot.
Ben deja, lire une valeur dans un unsigned int avec un "%d", c'est pas
genial.
Ensuite, ca serait certainement une assez bonne idee de regarder ce
que renvoie fscanf, vu qu'il est cense renvoyer quelque chose (le nombre
de valeurs lues correctement, typiquement).
Independamment de ces petits problemes, ton code n'a pas l'air si incorrect
que ca. Mais comme tu ne nous donnes qu'une fonction, c'est difficile de
savoir quelles choses tu peux faire ailleurs qui donne ce resultat.
Principe general: lorsque tu as un probleme, donne un source qui constitue
le probleme, de facon reproductible.
La, tu donnes un fragment de code, qui ne compile pas parce qu'il
manque des bouts. Et en fait, le probleme est ailleurs que dans le
fragment de code...
A force de trifouiller je me suis rendu compte que selon que je compile en
mode debug ou pas ça fonctionne ou pas...
Doit y avoir une feinte avec le compilateur, je vais trouver un newsgroup
adapté (visual C++ 7)
Tu fais ce que tu veux, mais ca n'est sans doute pas une bonne idee.
Plutot que de trifouiller dans les options du compilo, tu ne veux pas
donner un petit exemple complet qui compile et ne marche pas ?
Les histoires d'option de debug, c'est bien souvent le source lui-meme
qui est faux (comportement non defini) et le compilateur qui en fait
des choses differentes selon le cas.
Malgre tout le mal que je peux penser des produits microsoft, je ne serai
pas aussi rapide que toi a jeter la pierre sur le compilateur.
Non, c'est pas ce que je voulais dire, le compilo n'y est sans doute pour
rien mais mon projet comporte d'une part une librairie et d'autre part une
appli de test. Je me demande si des différences dans les options de
compilation de l'un est de l'autre ne provoquent pas des anomalies de ce
type.
Sinon pour le bout de code le voila, il est pas bien compliqué :
bool Sprite2DAnimated::load(std::string fileName)
{
FILE* file;
std::string temp;
int delay;
temp = fileName + ".ani";
file = fopen(temp.c_str(),"rt");
if(file == NULL)
return false;
fscanf(file,"%d",&delay);
fclose(file);
return true;
}
Cette méthode ne sert pas à grand chose puisque je suis resté bloqué sur le
problème du fscanf, ce qui explique que la valeur lue (delay) ne soit
exploitée nulle part
Tu veux dire un caractère '8' (binaire $38 en héxa ASCII) ou un binaire 8 ?
"%d" attend un int. Pour un unsigned int, c'est "%u"
D:CLCZZOUPLAZ>bc proj.prj
delay = 8
D:CLCZZOUPLAZ>type main.c
#include
int lire ()
{
FILE *file;
unsigned int delay;
file = fopen ("s.ani", "r");
if (file == NULL)
return 0;
fscanf (file, "%d", &delay);
printf ("delay = %un", delay);
fclose (file);
return 1;
}
int main (void)
{
(void) lire ();
return 0;
}
D:CLCZZOUPLAZ>type s.ani
8
D:CLCZZOUPLAZ>
Pour moi, il n'y a pas de problème avec ce code.
--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/r...px?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/