Pb bizarre avec les fichiers... [C/C++] - Programmation
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
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]
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
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
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); ??
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.
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 ?
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.
Marsh Posté le 06-12-2001 à 14:44:08
Voila la fin de mon fichier
Et voila ce que j'ai dans le FILE*:
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 ?
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...
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.
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)
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) |
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]
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
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]
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:
Ben j'ai encore du boulot, j'suis dans l'vent complet la...
Marsh Posté le 06-12-2001 à 17:33:55
Godbout a écrit a écrit : :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...
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...