[C/C++] Pb bizarre avec les fichiers...

Pb bizarre avec les fichiers... [C/C++] - Programmation

Marsh Posté le 06-12-2001 à 11:38:54    

je dois tester la fin d'un fichier, mais feof la trouve pas.
la fin de mon fichier est comme ceci:
 
511;
520;MOBALPA;MC Mobalpa 2001-2 F Cuisine;;AC Accessoires
524;;Prix;;1;0.57;1.39;0.00;;
 
 
Hors dans mon pointeur de fichier j'ai ca:
511;
520;MOBALPA;MC Mobalpa 2001-2 F Cuisine;;AC Accessoires
524;;Prix;;1;0.57;1.39;0.00;;
;MOBALPA;MC Mobalpa 2001-2 F Cuisine;;AC Accessoires
524;;Prix;;1;0.57;1.39;0.00;;

 
Les deux dernieres lignes n'ont rien a faire la, je comprends pas d'ou elles sortent !!
Et ca m'empeche de tester la fin de fichier...

Reply

Marsh Posté le 06-12-2001 à 11:38:54   

Reply

Marsh Posté le 06-12-2001 à 11:44:31    

Alternative : au debut tu fais :
 
fseek(in,0,SEEK_END);
int size = ftell(in);
fseek*in,0,SEEK_SET);
 
 
et ensuite tu test la fin de ton fichier :
 
if (ftell(in) == size)
 //fin du fichier

Reply

Marsh Posté le 06-12-2001 à 11:46:47    

ok  
j'essaie
 
mais tu pourrais m'expliquer ce qui va pas ?
 
le code c'est ca:
 
 
 
 
void LPVFile::ReadWinnerFile(char *winnerFileName)
{
 // while not a the end of the file
 
 int i = 0;
 
 while(!feof(winnerFile))
 {
  i++;
  GetLine();
  GetGlobalData();
 }
}
 
 
 
void LPVFile::GetLine()
{
 // To get the char  
 char car;
 
 // To count the field
 int index = -1;
 
 // Get the temp field
 char buf[1000] = {0};
 
 // while we are not at the end of the line
 while (car != '\n';)
 {
  // Get the first line car by car
  car = fgetwc(winnerFile);
 
  if (car != ';' && car != '\n';)
   strncat(buf, (char *)&car, 1);
  else
  {
   index++;
 
   // Check if we have an empty list
   if (m_bufferHead == NULL)
   {
    m_bufferNew = (PTRBUFFER) malloc (sizeof(BUFFER));
    m_bufferNew->index = index;
    strcpy(m_bufferNew->field, buf);
    m_bufferNew->next = NULL;+
    m_bufferHead = m_bufferNew;
   }
   //if no
   else
   {
    // Add at the end of the list
    m_bufferNew->next = (PTRBUFFER) malloc (sizeof(BUFFER));
    m_bufferNew = m_bufferNew->next;
    m_bufferNew->index = index;
    strcpy(m_bufferNew->field, buf);
    m_bufferNew->next = NULL;
   }
 
   memset(buf, 0, 255);
  }
 }
}

 

[edtdd]--Message édité par Godbout--[/edtdd]

Reply

Marsh Posté le 06-12-2001 à 11:53:36    

ce serait pas l'absence de retour chariot sur la dernière ligne qui fait merder la fonction getLine


---------------
Je ne suis ni pour, ni contre, bien au contraire  
Reply

Marsh Posté le 06-12-2001 à 11:58:54    

nan j'ai verifie y en a un...
J'ai initialise le pointeur de fichier aussi.
Les deux dernieres lignes je sais vraiment pas ce qu'elles font la, on dirait que ca a ete mal initialise, ou un truc dans le genre.
 
chris thx, ca marche ;)
mais bon je sais pas d'ou vient le pb et ca m'agace :mad:

Reply

Marsh Posté le 06-12-2001 à 13:29:21    

:/

Reply

Marsh Posté le 06-12-2001 à 13:45:52    

En tant qu'amateur, y a un truc qui me tarabuste :
 
// while we are not at the end of the line
while (car != '\n';)
{
}
le char car, il est à zéro grace au compilo ? Utilisé avant initialisation...
 
? mieux  
do
{
 
}while (car != '\n';) ??
 
EOF, on le rencontre quand on a lu le dernier caractère du fichier ('\n';), ou quand on lit le n + 1 ?
Quand on sort de dernière la ligne, on a lu '\n'. Faudrait peut-être (idiotie sans doute, suis mal réveillé ce matin) tester feof() quand on fait car = fgetwc(winnerFile); ??

Reply

Marsh Posté le 06-12-2001 à 13:53:49    

pour le premier car nan il n'est pas initialise, il l'est qu'apres la premiere fois que tu passes dans la boucle, mais bon meme en init ca change rien, txh qd meme ;)
 
Pour le teste feof quand on fait le fgetwc j'y ai pense aussi, mais en fait je me suis arrete sur le fait que le pointeur de fichier est pas bon, donc dans tous les cas il trouve la fin apres avoir lu des conneries qui n'ont rien a faire la.

Reply

Marsh Posté le 06-12-2001 à 14:21:29    

Godbout a écrit a écrit :

pour le premier car nan il n'est pas initialise, il l'est qu'apres la premiere fois que tu passes dans la boucle, mais bon meme en init ca change rien, txh qd meme ;)
 
Pour le teste feof quand on fait le fgetwc j'y ai pense aussi, mais en fait je me suis arrete sur le fait que le pointeur de fichier est pas bon, donc dans tous les cas il trouve la fin apres avoir lu des conneries qui n'ont rien a faire la.  




Es-tu sur de lire les conneries, car en fait il ne lis rien mais te renvoie le contenu precedent de ton buffer, nan ?

Reply

Marsh Posté le 06-12-2001 à 14:38:06    

BENB a écrit a écrit :

 
Es-tu sur de lire les conneries, car en fait il ne lis rien mais te renvoie le contenu precedent de ton buffer, nan ?  




 
ca doit etre ca, il renvoie le contenu du buffer, mais ca l'empeche de trouver la fin du fichier.

Reply

Marsh Posté le 06-12-2001 à 14:38:06   

Reply

Marsh Posté le 06-12-2001 à 14:44:08    

Voila la fin de mon fichier
 
http://site.voila.fr/godbout/fich1.jpg
 
 
Et voila ce que j'ai dans le FILE*:
 
http://site.voila.fr/godbout/fich2.jpg

Reply

Marsh Posté le 06-12-2001 à 14:49:00    

OUi mais ce qu'il y a apres le EOF dans ptr c'est n'importe quoi aucune importance...
 
Mais pourquoi tu fais pas des fread ?

Reply

Marsh Posté le 06-12-2001 à 14:51:27    

ben pour fread j'ai pas fait trop attention.
Je dois recupere chaque champ entre ';', comme le nombre de champs est indetermine j'ai fait une liste chainee.
Je recup caractere par caractere, et des que je trouve un ';' je copie ce que j'ai trouve dans mon champ, et je passe au maillon suivant.
Ca m'avait paru etre une bonne soluce, mais je vais faire un tour du cote de fread alors...

Reply

Marsh Posté le 06-12-2001 à 14:54:17    

ben de toute facon apparemment avec fread il faudra retravailler la chaine apres, pour faire ce que j'explique juste au dessus.

Reply

Marsh Posté le 06-12-2001 à 14:56:49    

Y'a déjà un gros souci au niveau du  
 
strcpy(m_bufferNew->field, buf);
 
tu fais un
char buf[1000] = {0};  
 
donc tu alloues un tableau qui contient n'importe quoi sauf le premier caractere.
 
or strcpy copie les caractères jusqu'a ce qu'il trouve le char 0
 
donc, ca pete deja la.
 
essaye de faire un  
char buf[1000];
memset(buf, 0, 1000);   (plus tres sur des arguments)
 
 [:thenicow]

Reply

Marsh Posté le 06-12-2001 à 14:57:43    

TheNicow a écrit a écrit :

Y'a déjà un gros souci au niveau du  
 
strcpy(m_bufferNew->field, buf);
 
tu fais un
char buf[1000] = {0};  
 
donc tu alloues un tableau qui contient n'importe quoi sauf le premier caractere.
 
or strcpy copie les caractères jusqu'a ce qu'il trouve le char 0
 
donc, ca pete deja la.
 
essaye de faire un  
char buf[1000];
memset(buf, 0, 1000);   (plus tres sur des arguments)
 
 [:thenicow]  




 
:non: char buf[1000] = {0} ca alloue le tab de 0 a 999
 
edit: pour les arguments de memset c'est ca :)

 

[edtdd]--Message édité par Godbout--[/edtdd]

Reply

Marsh Posté le 06-12-2001 à 14:58:11    

Pour ce qui est de splitter la chaine de caractere sur les ';', y'a deja une fonction C qui te fait ca.
 
strtok ou quelque chose du genre

Reply

Marsh Posté le 06-12-2001 à 14:58:15    

Ce que je fais c'est plutot des fread sur 512 octets par exemple pour remplir mon buffer, puis ensuite j'analyse mon buffer apres l'avoir converti en string STL a la recherche de separateurs (; \n pour toi)  
list<string> QueryWord;
{
        const char token=";\n";
     string request(query); <- query est un char*
     string::size_type beginTokenPos = 0;
        string::size_type endTokenPos;
        do
        {
            endTokenPos = request.find_firstof(token,beginTokenPos); // find next token
            if (endTokenPos == string::npos)                 // Is there any ?
             endTokenPos = request.size();        // no more ? set at the end
            string substring = request.substr(beginTokenPos,endTokenPos-beginTokenPos); // get the word
            queryWord.push_back(substring);      // store it
            beginTokenPos = endTokenPos+1;      // set at the begining of the next one
        }
        while(beginTokenPos<request.size());
    }

 

[edtdd]--Message édité par BENB--[/edtdd]

Reply

Marsh Posté le 06-12-2001 à 15:00:10    

BENB a écrit a écrit :

Ce que je fais c'est plutot des fread sur 512 octets par exemple pour remplir mon buffer, puis ensuite j'analyse mon buffer apres l'avoir converti en string STL a la recherche de separateurs (; \n pour toi)  
list<string> QueryWord;
{
        const char token=";\n";
     string request(query); <- query est un char*
     string::size_type beginTokenPos = 0;
        string::size_type endTokenPos;
        do
        {
            endTokenPos = request.find_firstof(token,beginTokenPos); // find next token
            if (endTokenPos == string::npos)                 // Is there any ?
             endTokenPos = request.size();        // no more ? set at the end
            string substring = request.substr(beginTokenPos,endTokenPos-beginTokenPos); // get the word
            queryWord.push_back(substring);      // store it
            beginTokenPos = endTokenPos+1;      // set at the begining of the next one
        }
        while(beginTokenPos<request.size());
    }  
 
 




 
:ouch::ouch:
 
Ben j'ai encore du boulot, j'suis dans l'vent complet la...

Reply

Marsh Posté le 06-12-2001 à 17:33:55    

Godbout a écrit a écrit :

 
 
:ouch::ouch:
 
Ben j'ai encore du boulot, j'suis dans l'vent complet la...  




 
Bon dans l'exemple que je te donne il n'y a que l'analyse lexical (bien grand mot) pas la lecture, pour la lecture tu lis a grand coups de fread...
 
request c'est la string qui contient ce que je veux analyser...
et find_firstof me donne l'occurence suivante d'un des carateres dans la chaine, grosso modo l'endroit ou se trouve le prochain ; ou le \n situe apres beginTokenPos qui est le debut de la chaine que j'analyse... le retour de cette methode endTokenPos est donc npos si la recherche a echouee et l'endroit ou se trouve ce caractere dans le cas contraire... je mets la sous chaine dans substring (de begin... a end...) que j'enregistre dans mon tableau (push_back)
puis je place le debut de mon analyse sur le caractere suivant...

Reply

Sujets relatifs:

Leave a Replay

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