Problème lecture d'un fichier de 500 Ko
Bonjour,
Voilà un programme de notre laboratoire génère un fichier résultat (data.txt) que je souhaite parcourir en l'enregistrant dans un tableau de charactère (txt[]) afin de rechercher les données interessantes, je n'ai pas de soucie pour la recherche et pour l'écriture... En revanche, mon tableau qui doit posséder le fichier résultat n'est pas l'exact copie du fichier. En fait, mon tableau est de la bonne taille mais les données se répètent sans arrêt. Ces données (récupéré) sont d'ailleurs plutot celle de la fin du fichier résultat. Bref, voilà le début de mon code : (je précise que mon projet est un projet DOS, j'ai windows XP, j'utilise Borland C++).
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| long unsigned int i=0, endTxt=SizeOfFileTexte();
char *a,*txt;
txt = new char[endTxt];
FILE *p;
p=fopen("data.txt","r");
while(i<endTxt)
{
fread(a,sizeof(char),1,p);
txt[i]=*a;
i+=1;
}
fclose(p); |
La fonction SizeOfFileTexte() est vérifier mais comme elle apparait je mets son code aussi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| long unsigned int SizeOfFileTexte(void)
{
FILE *p;
p=fopen("data.txt","r");
char *a;
long unsigned int e=0;
while(fread(a,sizeof(char),1,p))
{
e+=1;
}
fclose(p);
return(e);
} |
Je vous remercie par avance pour m'aider à correctement récupérer mon tableau car je n'y comprends plus rien. Il est a noter que ce fichier fait 500 Ko.
Merci à vous,
Au sujet de l'intérêt des capacités propres du C++
Salut,
Citation:
Envoyé par
Youry
Oui c'est vrai que c'est assez proche du C bon il y a quand même new :)
Merci pour ta réponse je vais utilisé l'exemple que tu m'as donné car c'est clair que c'est puissant le vrai C++. Je me rappelé plus les fonction I/O c++
l'opérateur new ne suffit pas à pouvoir décider que l'on code en C++, bien que ce soit un opérateur qui n'existe pas en C...
Comme JolyLoic l'a signalé, il existe une entrée dans la FAQ pour charger l'ensemble d'un fichier dans un buffer, et je te conseille fortement de l'utiliser ;)
Citation:
Envoyé par
fcharton
Si tu utilises des FILE, fopen, et fread, peut être devrais tu faire
Code:
p=fopen("data.txt","rb");
"r" ca ouvre en fichier texte... "rb" en binaire. En général, si tu utilised getline, gets, etc... tu veux un fichier texte, si tu utilises fread, fseek, tu veux un fichier binaire...
Francois
Mais, par pitié, sur le forum C++, la première chose à faire, c'est de veiller à donner des solutions C++...
Cela signifie que dés que l'on remarque FILE, fread, fwrite, fopen, fclose ou même char* (plus toutes les choses auxquelles je ne pense pas), il faut tirer un signal d'alarme et bien faire comprendre à la personne qu'il travaille en C.
Ceci dit, il y a une incohérence dans ce que tu nous écris:
D'un coté, tu utilises un fichier dont l'extension est en *.txt, ce qui fait penser que tu utilise un fichier considéré comme étant un fichier contenant... du texte (des chaines de caractères, en fait), et de l'autre, tu ouvre ton fichier en mode "binaire", ce qui fait penser que tu souhaite gérer le contenu du fichier comme ... des données brutes...
Dans le cas où tu veux gérer le contenu comme des données brutes, l'idéal serait sans doute d'utiliser un std::vector<char> (la classe vector est la classe que l'on conseille fortement d'utiliser de préférence à des tableaux "C style", disponible dans l'espace de nom std par simple inclusion du fichier d'en-tête <vector> car elle permet de travailler de manière bien plus simple et plus sécuritaire que ce que permettent les tableaux "C style" ;))
Dans le cas où tu souhaites gérer le contenu du fichier comme des chaines de caractères, il semble raisonnable de penser que ce ne soit pas un ensemble de caractères qui t'intéresse, mais bien un ensemble de chaines de caractères (qu'un caractère seul ne suffise généralement pas pour faire ton travail)...
L'idéal est donc, au choix:
Soit de récupérer séparément l'ensemble des mots dans un tableau de chaines de caractères std::vector<std::string> (la classe std::string est la classe à utiliser pour les chaines de caractères, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <string>)
Soit de récupérer chaque ligne du fichier dans un tableau de chaines de caractères...
Dans le premier cas, le code pour y arriver serait proche de
Code:
1 2 3 4 5 6
| std::vector<std::string> tab;
std::string temp;
std::ifstream ifs("fichier.txt");
while(ifs>>temp)
tab.push_back(temp);
/*...*/ |
et dans le deuxième cas, ce serait plutôt proche de
Code:
1 2 3 4 5 6 7 8 9
| std::vector<std::string> tab;
std::string temp;
std::ifstream ifs("fichier.txt");
while(std::getline(ifs,temp))
tab.push_back(temp);
/*...
* NOTA: il faudra sans doute un moyen de gérer le contenu de
* chaque ligne lue ;)
*/ |
Ce message a servi de base à débat portant sur la réalité des bonnes pratiques.
Vous pourrez retrouver ce débats dans cette discussion