Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1152 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°78741
godbout
Génial.
Posté le 06-12-2001 à 11:38:54  profilanswer
 

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

mood
Publicité
Posté le 06-12-2001 à 11:38:54  profilanswer
 

n°78745
chrisbk
-
Posté le 06-12-2001 à 11:44:31  profilanswer
 

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

n°78746
godbout
Génial.
Posté le 06-12-2001 à 11:46:47  profilanswer
 

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]

n°78751
jupiler
Un cousin...
Posté le 06-12-2001 à 11:53:36  profilanswer
 

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  
n°78756
godbout
Génial.
Posté le 06-12-2001 à 11:58:54  profilanswer
 

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:

n°78783
godbout
Génial.
Posté le 06-12-2001 à 13:29:21  profilanswer
 

:/

n°78790
Carbon_14
Posté le 06-12-2001 à 13:45:52  profilanswer
 

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); ??

n°78793
godbout
Génial.
Posté le 06-12-2001 à 13:53:49  profilanswer
 

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.

n°78807
BENB
100% Lux.
Posté le 06-12-2001 à 14:21:29  profilanswer
 

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 ?

n°78808
godbout
Génial.
Posté le 06-12-2001 à 14:38:06  profilanswer
 

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.

mood
Publicité
Posté le 06-12-2001 à 14:38:06  profilanswer
 

n°78814
godbout
Génial.
Posté le 06-12-2001 à 14:44:08  profilanswer
 

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

n°78818
BENB
100% Lux.
Posté le 06-12-2001 à 14:49:00  profilanswer
 

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 ?

n°78819
godbout
Génial.
Posté le 06-12-2001 à 14:51:27  profilanswer
 

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

n°78822
godbout
Génial.
Posté le 06-12-2001 à 14:54:17  profilanswer
 

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

n°78824
TheNicow
Posté le 06-12-2001 à 14:56:49  profilanswer
 

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]

n°78825
godbout
Génial.
Posté le 06-12-2001 à 14:57:43  profilanswer
 

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]

n°78826
TheNicow
Posté le 06-12-2001 à 14:58:11  profilanswer
 

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

n°78827
BENB
100% Lux.
Posté le 06-12-2001 à 14:58:15  profilanswer
 

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]

n°78829
godbout
Génial.
Posté le 06-12-2001 à 15:00:10  profilanswer
 

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

n°78914
BENB
100% Lux.
Posté le 06-12-2001 à 17:33:55  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
Lire et/ou Ecrire dans des fichiers XML et/ou CSV[PHP] include de 2 fichiers, c le bordel !!
[VC6.0] Ou trouver une dialog box de sélection de fichiers/répertoiresPHP, protéger ses fichiers
Les fichiers systèmes[JAVA] Fichiers properties
[BATCH] renommage de bocou de fichiersphp : gestion de fichiers
[VBS] Erreur bizarreNombre de fichiers max dans un répertoire ?
Plus de sujets relatifs à : [C/C++] Pb bizarre avec les fichiers...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR