fgets ne marche qu'une fois... [C] - C - Programmation
Marsh Posté le 16-10-2006 à 16:33:51
J'ai codé le truc en c++ avec des ifstream et des std::getline et j'ai le même problème...
Marsh Posté le 16-10-2006 à 16:44:27
Pourrais tu nous mettre le code pertinent en entier (entre balises [cpp])
Marsh Posté le 16-10-2006 à 16:51:10
J'aurais dû faire ça tout de suite oui...
Code :
|
la première fois que j'ouvre le fichier je rentre dans le while, si j'ouvre à nouveau le fichier fgets renvoie NULL tout de suite, même avec rewind ou fseek.
je précise typedef char CHAINE[MAXLEN];
Marsh Posté le 16-10-2006 à 17:23:52
kaloskagatos a écrit : |
OK.
Citation : Si je repasse le même nom de fichier, fgets renvoie NULL direct... |
Je ne connais pas de fonction 'repasse()'. Montre ce code là.
Marsh Posté le 16-10-2006 à 17:30:37
kaloskagatos a écrit : |
Code :
|
Essaye ça, c'est plus clair.
Si le défaut persiste, explique plus précisément ce qui se passe. Tu appelles 2 fois ce code ? Il est 2 fois dans ton programme ? Tu appelle deux fois le programme qui contient ce code ? J'ai du mal à saisir les circonstantes du problème signalé.
Marsh Posté le 16-10-2006 à 17:52:02
Emmanuel Delahaye a écrit : |
Salut,
J'appelle deux fois ce code avec le même nom de fichier (pendant la même exécution du programme). J'ai une fenêtre Motif dans laquelle je renseigne le "const char* fileName" qui est en paramètre de la fonction et ce code est appelé pour lire le fichier.
J'ai modifié le code comme tu me l'as proposé mais le comportement est le même, j'arrive à ouvrir/lire/fermer un fichier texte mais quand je rappelle cette fonction le fichier est bien ouvert (streamFile != NULL) mais fgets(ligne, MAXLEN, streamFile) == NULL
Le problème ne se produit que lorsque c'est le même fichier qu'on ouvre d'affilé, si ce sont deux fichier différents les deux sont correctement lus !
Par ailleurs : #define MAXLEN 1024
Marsh Posté le 16-10-2006 à 21:14:07
up !
Marsh Posté le 16-10-2006 à 22:35:10
Je n'ai aucun problème avec ce code : (appelé n fois, peu importe)
Code :
|
Marsh Posté le 17-10-2006 à 10:22:17
Merci pour ton aide, j'aurais du faire un petit programme de test comme ça, c'est au niveau de la récupération du nom de fichier la deuxième fois que mon code avait un problème, je considérais le nom du répertoire et non le fichier lui-même...
Pardon de t'avoir fair perdre un peu de temps
Si tu repasses par là, peux-tu me dire pourquoi tu écris static char const fileName[] = "xxx.txt"; avec static et char const dans ce sens? Merci
Marsh Posté le 17-10-2006 à 10:54:10
kaloskagatos a écrit : Si tu repasses par là, peux-tu me dire pourquoi tu écris static char const fileName[] = "xxx.txt"; avec static et char const dans ce sens ? |
Euh, quel sens ? char et const sont commutatifs...
Sinon, le choix de ce codage est un vieux reflexe de codeur C pour l'embarqué. "Un byte est un byte".
static char const fileName[] = "xxx.txt"
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
char const fileName[] = "xxx.txt"
static char fileName[] = "xxx.txt"
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
-> Une zone de donnée : tableau de 8 char
-> Du code de recopie
static char const *fileName = "xxx.txt"
static char *fileName = "xxx.txt" (risque d'erreur)
char const *fileName = "xxx.txt"
char *fileName = "xxx.txt" (risque d'erreur)
-> Une zone de code contenant : {'x','x','x','.','t','x','t',0}
-> Une zone de donnée : un pointeur vers cette zone de code.
Marsh Posté le 17-10-2006 à 11:46:23
Bon tout est bien qui fini bien, mais tout ça car tu t'étais planté dans le nom du fichier ... Sérieux, essaie de réfléchir avant de poster, merci.
Marsh Posté le 17-10-2006 à 11:50:05
squall2023 a écrit : Bon tout est bien qui fini bien, mais tout ça car tu t'étais planté dans le nom du fichier ... Sérieux, essaie de réfléchir avant de poster, merci. |
T'es qui toi ?
Marsh Posté le 16-10-2006 à 15:42:49
Bonjour,
J'ouvre un fichier texte avec FILE*streamFile = fopen(fileName,"r" ),
je lis ligne par ligne avec fgets != NULL
et quand c'est fini je ferme le fichier fclose(streamFile)
Tout se passe bien une fois.
Si je repasse le même nom de fichier, fgets renvoie NULL direct...
J'ai essayé de faire:
rewind(streamFile);
ou
fseek(streamFile,SEEK_SET,0);
après l'ouverture du fichier mais ça ne change rien. Tête dans le guidon je vois pas ce qui cloche... Merci d'avance.
Message édité par kaloskagatos le 16-10-2006 à 16:41:35