[C] fgets ne marche qu'une fois...

fgets ne marche qu'une fois... [C] - C - Programmation

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 cité 1 fois
Message édité par kaloskagatos le 16-10-2006 à 16:41:35
Reply

Marsh Posté le 16-10-2006 à 15:42:49   

Reply

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...
 

Reply

Marsh Posté le 16-10-2006 à 16:44:27    

Pourrais tu nous mettre le code pertinent en entier (entre balises [cpp])

Reply

Marsh Posté le 16-10-2006 à 16:51:10    

J'aurais dû faire ça tout de suite oui...  
 
 

Code :
  1. CHAINE ligne;
  2. CHAINE word;
  3.  
  4.   FILE *streamFile = NULL;
  5.   streamFile = fopen(fileName, "r" );
  6.  
  7.   if ( streamFile > 0 )
  8.   {
  9. //rewind(streamFile);
  10. //fseek(streamFile,SEEK_SET,0);
  11.  
  12. while( fgets(ligne, MAXLEN, streamFile) != NULL )
  13. {
  14.   //traitement de ligne
  15. }
  16.    }
  17.   else
  18.     {
  19.       error = -1;
  20.       sprintf(errorMessage,"Can't open Chimera Mask file (%s)",fileName);
  21.     }
  22.   fclose(streamFile);


 
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];

Message cité 1 fois
Message édité par kaloskagatos le 16-10-2006 à 16:58:49
Reply

Marsh Posté le 16-10-2006 à 17:23:52    

kaloskagatos a écrit :


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.


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à.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-10-2006 à 17:30:37    

kaloskagatos a écrit :


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.


Code :
  1. typedef char CHAINE[MAXLEN];
  2. /* -ed- c'est quoi MAXLEN ? */
  3. CHAINE ligne;
  4. CHAINE word;
  5. /* -ed- c'est quoi CHAINE ? */
  6.  
  7.   FILE *streamFile = NULL;
  8.   streamFile = fopen(fileName, "r" );
  9. /* -ed-  
  10.   if ( streamFile > 0 )
  11. atypique, mais correct. Je prefere   
  12. */
  13.   if ( streamFile != NULL )
  14.   {
  15. while( fgets(ligne, MAXLEN, streamFile) != NULL )
  16. {
  17.   //traitement de ligne
  18. }
  19.      /*  -ed- deplace */
  20.      fclose(streamFile);
  21.    }
  22.   else
  23.     {
  24.       error = -1;
  25.       sprintf(errorMessage,"Can't open Chimera Mask file (%s)",fileName);
  26.     }
  27. /* -ed- mal place  
  28.   fclose(streamFile);
  29. */


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é.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-10-2006 à 17:52:02    

Emmanuel Delahaye a écrit :


Je ne connais pas de fonction 'repasse()'. Montre ce code là.


 
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

Reply

Marsh Posté le 16-10-2006 à 21:14:07    

up !


---------------
« Le hasard, c’est différent de la chance. Parce que la chance, je n'en ai jamais. »
Reply

Marsh Posté le 16-10-2006 à 22:35:10    


Je n'ai aucun problème avec ce code :  (appelé n fois, peu importe)

Code :
  1. #include <stdio.h>
  2. #define MAXLEN 1024
  3. int main (void)
  4. {
  5.    int error = 0;
  6.    static char const fileName[] = "xxx.txt";
  7.    FILE *streamFile = fopen (fileName, "r" );
  8.    if (streamFile != NULL)
  9.    {
  10.       char ligne[MAXLEN];
  11.       while (fgets (ligne, sizeof ligne, streamFile) != NULL)
  12.       {
  13.          //traitement de ligne
  14.          printf ("%s", ligne);
  15.       }
  16.       fclose (streamFile);
  17.    }
  18.    else
  19.    {
  20.       error = -1;
  21.       fprintf (stderr, "Can't open Chimera Mask file (%s)", fileName);
  22.    }
  23.    return 0;
  24. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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 :)

Reply

Marsh Posté le 17-10-2006 à 10:22:17   

Reply

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.


Message édité par Emmanuel Delahaye le 17-10-2006 à 10:54:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-10-2006 à 11:15:41    

Ok je vois un peu mieux, je vais creuser un peu plus.
 
A+

Reply

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.

Reply

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 ? [:mlc]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed