Bonjour,
j'utilise:
- Windows XP SP2
- Visual c++ 2005 Express Edition SP1
Mon programme fonctionne parfaitement quand j'utilise: g++ 3.4.4.
(Autant sous linux que sous windows)
Le programme parcours le fichier et annalyse le texte.
J'ai commencé avec une lecture caractère par caractère et je constate que de temps à autre, j'ai besoin de lire des lignes.
ça ne pose pas de problème sur de très petit fichier ( < 4'096 caractères)
Maintenant que mon parser est quasi fini, je constate que j'ai un soucis de temps en temps au moment où je dois revenir en arrière sur des fichiers plus grand que 4'096 caractères.
Ce qui se passe:
avec le debugger, j'ai pu constater que le fichier est parcourus par bloque de 4'096 caractères.
Le programme dépasse se bloque de 4'096 en appelant la fonction get() ou getline().
Ensuite le bug survient au moment où le programme doit revenir sur ces pas. J'utilise unget() plusieurs fois dans une boucle for (En raison d'un autre bug, voir rem ci-dessous).
A ce moment le pointeur doit se perdre car je n'arrive plus à lire de caractères.
A) Donc est-ce que c'est possible de modifier le nombre de caractères chargé ?
(J'ai observé avec le debugger en me plaçant sur pointeur de type fstream puis j'ai parcourus les éléments suivants /+ _Filebuffer /+ _Myfile /+ _bufsize = 4096
B) Est-ce qu'il est possible d'indiquer lorsque l'on ouvre le fichier qu'il soit totallement chargé en mémoire ? (fichier toujours plus petit que 10Mo)
C) Est-ce qu'il y a qqch à modifier ou indiquer sous Visual C++ pour utiliser correctement la classe fstream ?
REM:
Ouvrir le fichier:
lire un caractère:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string thefile = "nom du fichier"; fstream * pOpenedFile; pOpenedFile = new fstream(thefile.c_str());
lire une ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char readChar; pOpenedFile->get(readChar);
retour en arrière:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 string strLine; getline(*pOpenedFile,strLine);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for(unsigned int i=0; i <= (strLine.length() - found ); i++) { pOpenedFile->unget(); }
Si j'utilise pas les fonctions tellg() et seekg() c'est que les pointeurs retourné n'ont aucun sens lors que les fins de lignes sont signalées par Line Feed ( 0x0A ou '\n' )
(Un autre bug sous Visual C++ 2005 enfin, j'en suis pas certain.)
Et comme je souhaite pouvoir annalyser des fichiers texte au format UNIX ou Dos, je ne me limite pas au fin de ligne: Carriage Return et Line Feed ( 0x0D 0x0A ou "\r\n" ) donc, je n'ai pas utilisé ces 2 fonctions (tellg et seekg).
Voir: http://forums.microsoft.com/MSDN/Sho...08912&SiteID=1
(Message concernant ce problème.)
PS:
Si vous avez des conseilles pour annalyser (parser) un fichier texte, je suis preneur. Mais, je ne pense pas pouvoir les mettre tout de suite en pratique car je souhaite éviter de devoir réécrire la moitié de mon code pour les mettre en pratique.
PS2:
S'il vous manque des infos, n'hésitez pas à me l'indiquer.
Partager