[C++] Recherche d'une chaine dans un fichier

Recherche d'une chaine dans un fichier [C++] - C++ - Programmation

Marsh Posté le 27-10-2003 à 15:55:16    

Salut,
solution "simple" :
- on lit le fichier à coup de read de n octets et on met tout en mémoire, ensuite on scrute ce qui est en mémoire avec les fonction de recherches déjà implémentées dans la STL.
- caractères par caractères on compare > c bof non ?
 
mais alors pour la première solution, si le fichier est trop gros pour tenir en RAM, comment faire ? diviser le travail en plusieurs parties, mais comment faire pour gérer la coupure entre les 2 parties si justement la chaine à chercher et couper à cet endroit ?
 
merci
   ANT
 
P.S. : je ne fais pas cette opération que sur des fichiers textes

Reply

Marsh Posté le 27-10-2003 à 15:55:16   

Reply

Marsh Posté le 27-10-2003 à 16:06:07    

il y a une fonction qui sert a lire le fichier ligne par ligne,
je t'explique, le tps que ton fichier n'est pas terminé, elle va te renvoyer chaine par chaine les lignes de ton fichier
==> plus de pb de buffer!


---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 27-10-2003 à 16:08:35    

Code :
  1. ifstream fichier_lecture("c:\\42.txt" );
  2. CString   toto;
  3. while (fichier_lecture.getline(toto, 2048, '\n'))
  4.      {
  5.        //toto contient la ligne de ton fichier, tu n'a plus qu'a checker ta ligne voir si quelque chose t'interesse dedant
  6.        ...
  7.      }


Message édité par husiana le 27-10-2003 à 16:10:18

---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 27-10-2003 à 16:08:55    

Ben tu charge une partie du fichier en mémoire, tu cherche si tu arrive en bout de buffer alors que tu est en plein milieu du schema recherché, tu recopie ce qui a été identifié en début de buffer (optionnel suivant ce que l'on veut faire), tu compléteavec la suite du fichier et tu continue. Tu garde en mémoire ta position absolue dans le fichier et c bon.


---------------
Le Tyran
Reply

Marsh Posté le 27-10-2003 à 16:22:15    

LetoII a écrit :

Ben tu charge une partie du fichier en mémoire, tu cherche si tu arrive en bout de buffer alors que tu est en plein milieu du schema recherché, tu recopie ce qui a été identifié en début de buffer (optionnel suivant ce que l'on veut faire), tu compléteavec la suite du fichier et tu continue. Tu garde en mémoire ta position absolue dans le fichier et c bon.


 
oui donc c'est ce que je vais faire, il n'y a pas de méthode miracle :hello:

Reply

Marsh Posté le 27-10-2003 à 18:15:29    

à mon avis il existe déjà un truc pour adapter les fonctions de recherche à la classe stream, peut-être en passant par des adaptateurs vers des collections, mais il est pas question de gérer sa mémoire à la main sur des truc aussi simples.
 
edit :
http://www.sgi.com/tech/stl/search.html
 
avec ça, qui devrait en fait pas être trop dur à utiliser vu que dans la STL tout est surchargé pour être compatible avec à peu près n'importe quoi.


Message édité par nraynaud le 27-10-2003 à 18:31:24
Reply

Marsh Posté le 29-10-2003 à 13:43:58    

nraynaud a écrit :

à mon avis il existe déjà un truc pour adapter les fonctions de recherche à la classe stream, peut-être en passant par des adaptateurs vers des collections, mais il est pas question de gérer sa mémoire à la main sur des truc aussi simples.
 
edit :
http://www.sgi.com/tech/stl/search.html
 
avec ça, qui devrait en fait pas être trop dur à utiliser vu que dans la STL tout est surchargé pour être compatible avec à peu près n'importe quoi.


 
Je pense avoir compris comment marche cette fonction search de la STL sur des vector / listes mais pour des string je ne vois pas, et encore moins comment l'utiliser avec un stream, quelqu'un peut-il m'aider (j'utilise un ifstream) ?
merci

Reply

Marsh Posté le 29-10-2003 à 15:51:52    

une solution un peu bidouille que j'utilise (j'avais pas trouvé mieux mais ça marche tres bien)

Code :
  1. AnsiString LigneFichier ;
  2.             MemoFichier->Lines->LoadFromFile(OpenDialog1->FileName) ;
  3.             int i, booleen, nb ;  //i=numéro de ligne  boolen=teste si chaine présente  nb=nb de ligne
  4.             nb=MemoFichier->Lines->Count;
  5.          for(i=0 ; i<nb ; i++) {
  6.                 LigneFichier=MemoFichier->Lines->Strings[i] ;
  7.                 booleen=LigneFichier.AnsiPos("Commentaire permettant au programme C++ de se repérer" ) ;


 
...je suis débutant donc ma solution est ptet nulle! :)


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
Reply

Marsh Posté le 29-10-2003 à 15:56:59    

en gros je stocke le fichier dans un memo
et je le lis/compare ligne par ligne


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
Reply

Marsh Posté le 29-10-2003 à 15:59:08    

ben perso je trouve un peu que ca sert a rien ce que tu faispk ne pas analyser le fichier ligne par ligne directement?
 
genre ce que j'ai posté plus haut, puis la c'est le mm probleme, si le nb de ligne est superieur a un 2^32 c cuit!
 
qu'avec un getline...noproblemo


---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 29-10-2003 à 15:59:08   

Reply

Marsh Posté le 29-10-2003 à 15:59:42    

husiana a écrit :

Code :
  1. ifstream fichier_lecture("c:\\42.txt" );
  2. CString   toto;
  3. while (fichier_lecture.getline(toto, 2048, '\n'))
  4.      {
  5.        //toto contient la ligne de ton fichier, tu n'a plus qu'a checker ta ligne voir si quelque chose t'interesse dedant
  6.        ...
  7.      }




---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 29-10-2003 à 16:02:15    

husiana a écrit :

ben perso je trouve un peu que ca sert a rien ce que tu faispk ne pas analyser le fichier ligne par ligne directement?
 
genre ce que j'ai posté plus haut, puis la c'est le mm probleme, si le nb de ligne est superieur a un 2^32 c cuit!
 
qu'avec un getline...noproblemo


 
En même temps un fichier de plus de 2Go vaut mieux pas trop s'amuser à le charger en mémoire ;)


Message édité par LetoII le 29-10-2003 à 16:03:29

---------------
Le Tyran
Reply

Marsh Posté le 29-10-2003 à 16:04:23    

oui mais non...! j'aime pas qd il y a une possibilité que ca plante :P


---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 30-10-2003 à 13:26:11    

alors recentrons un peu le sujet :
suite à l'intervention louable d'nraynaud j'aimerais bien si possible que quelqu'un me donne des pistes de code pour combiner la méthode search et mon flux ifstream de la STL pour faire une recherche dans ce flux.
Et non que tout le monde me donne son code pour lire un fichier, ça c'est bon, merci  :wahoo:


Message édité par antsite le 30-10-2003 à 13:27:01
Reply

Marsh Posté le 30-10-2003 à 13:43:58    

ANTSite a écrit :

alors recentrons un peu le sujet :
suite à l'intervention louable d'nraynaud j'aimerais bien si possible que quelqu'un me donne des pistes de code pour combiner la méthode search et mon flux ifstream de la STL pour faire une recherche dans ce flux.
Et non que tout le monde me donne son code pour lire un fichier, ça c'est bon, merci  :wahoo:  


 
Bon si j'ai bien compris la chose, ce que je ferai moi c un foward_iterator ou un bidirectional_iterator basé sur un istream_iterator et je l'utiliserai dans l'algorithme search.


---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 13:52:09    

Ben Taz c'est barré, et c'était le seul a avoir consacré les 7 ans dans un monastère tibétain à méditer les paroles du Sage (le relou prétentieux avec sa barbe et ses lunettes dont personne ne sait écrire le nom sans modèle) pour utiliser correctement ce langage douteux. Donc t'es dans la merde.


Message édité par nraynaud le 30-10-2003 à 13:55:23
Reply

Marsh Posté le 30-10-2003 à 13:56:46    

husiana a écrit :

Code :
  1. ifstream fichier_lecture("c:\\42.txt" );
  2. CString   toto;
  3. while (fichier_lecture.getline(toto, 2048, '\n'))
  4.      {
  5.        //toto contient la ligne de ton fichier, tu n'a plus qu'a checker ta ligne voir si quelque chose t'interesse dedant
  6.        ...
  7.      }




MFC :o
 

Petit Prince a écrit :

une solution un peu bidouille que j'utilise (j'avais pas trouvé mieux mais ça marche tres bien)

Code :
  1. AnsiString LigneFichier ;
  2.             MemoFichier->Lines->LoadFromFile(OpenDialog1->FileName) ;
  3.             int i, booleen, nb ;  //i=numéro de ligne  boolen=teste si chaine présente  nb=nb de ligne
  4.             nb=MemoFichier->Lines->Count;
  5.          for(i=0 ; i<nb ; i++) {
  6.                 LigneFichier=MemoFichier->Lines->Strings[i] ;
  7.                 booleen=LigneFichier.AnsiPos("Commentaire permettant au programme C++ de se repérer" ) ;


 
...je suis débutant donc ma solution est ptet nulle! :)


VCL :o
 
Eh les gars, vous avez pas remarqué qu'il parle de STL ? :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-10-2003 à 14:07:36    

nraynaud a écrit :

Ben Taz c'est barré, et c'était le seul a avoir consacré les 7 ans dans un monastère tibétain à méditer les paroles du Sage (le relou prétentieux avec sa barbe et ses lunettes dont personne ne sait écrire le nom sans modèle) pour utiliser correctement ce langage douteux. Donc t'es dans la merde.


 
Bha ouai, et moi je cherche tjrs une vrai doc sur la STL, chacun sa croix  [:spamafote]


---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 15:00:00    

LetoII a écrit :


Bha ouai, et moi je cherche tjrs une vrai doc sur la STL, chacun sa croix  [:spamafote]  

La vraie doc, on l'a tous, elle est là :
http://www.sgi.com/tech/stl/
 
Par contre, les années de méditation dessus, on est nombreux à ne pas les avoir (et perso, tant que j'y suis pas obligé, j'évite de trop me mettre là-dedans, c'est pas exactement compatible avec ma recherche de qualité).

Reply

Marsh Posté le 30-10-2003 à 15:21:15    

nraynaud a écrit :

La vraie doc, on l'a tous, elle est là :
http://www.sgi.com/tech/stl/
 
Par contre, les années de méditation dessus, on est nombreux à ne pas les avoir (et perso, tant que j'y suis pas obligé, j'évite de trop me mettre là-dedans, c'est pas exactement compatible avec ma recherche de qualité).


 
Non ça c pas une vrai doc, c le foutoir, nuence.
 
Bon si non j'ai preque réeussi à faire marcher search avec un istream_iterator, sauf que ça me sot des résultats bizard... j'aurais du me chrenométrer tien...


---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 15:55:14    

Bon ben je rend mon tablier là, y a un problème de synchro entre le istream_iterator et le ifstream mais j'ai beau éplucher la doc je vois pas comment le raisoudre.


---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 16:38:50    

Bon le mieux que je suis arriver à faire c avoir la suite du fichier après le texte recherché [:ddr555]


Message édité par LetoII le 30-10-2003 à 16:39:13

---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 16:57:23    

Petit Prince a écrit :

en gros je stocke le fichier dans un memo


 
non, un RichEdit c'est plus marrant; c'est encore plus lourd [:dawa]
 
Le TMemo sert à AFFICHER du texte
Si c'est juste pour le lire le fichier et traiter son contenu il y a TStringList (le "Lines" du TMemo est d'ailleurs un TStringList).
Mais le problème est le même que celui de départ : tout le fichier est lu en RAM, donc je vois pas trop l'intérêt de cette solution par rapport à une chaîne.
D'autant plus que là on n'est plus dans la STL mais dans la VCL.


Message édité par antp le 30-10-2003 à 16:58:05

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 31-10-2003 à 09:04:10    

svp svp svp, dites moi pk ne pas faire un getline ?


---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 31-10-2003 à 09:54:35    

La premiere raison que je vois pour le getline c que si tu cherches un truc qui contient un \r\n ou mm \n ca marchera pas tel quel.

Reply

Marsh Posté le 31-10-2003 à 10:09:40    

oki oki, je l'aime mon getline :-p!


---------------
http://husiana.myftp.org/phpsysinfo
Reply

Marsh Posté le 31-10-2003 à 10:23:55    

VisualC++ a écrit :

La premiere raison que je vois pour le getline c que si tu cherches un truc qui contient un \r\n ou mm \n ca marchera pas tel quel.


 
De plus il compte utiliser ça aussi sur des fichiers binnaire où le concepte de ligne n'a pas forcément de sens


---------------
Le Tyran
Reply

Marsh Posté le 01-11-2003 à 02:15:55    

antp a écrit :


 
non, un RichEdit c'est plus marrant; c'est encore plus lourd [:dawa]
 
Le TMemo sert à AFFICHER du texte
Si c'est juste pour le lire le fichier et traiter son contenu il y a TStringList (le "Lines" du TMemo est d'ailleurs un TStringList).
Mais le problème est le même que celui de départ : tout le fichier est lu en RAM, donc je vois pas trop l'intérêt de cette solution par rapport à une chaîne.
D'autant plus que là on n'est plus dans la STL mais dans la VCL.


 
vi j'ai changé entretps :)
 
merchi


---------------
Black List : FABD!!! <-ne pas lui faire confiance!
Reply

Marsh Posté le 01-11-2003 à 10:49:57    

pour l'instant je l'ai fait à la main, read de x chars et recherche via petit algo, ça marche bien, maintenant si quelqu'un trouve un jour comment utiliser search sur les flux, ça m'intéresse.

Reply

Marsh Posté le 03-11-2003 à 12:57:12    

ANTSite a écrit :

pour l'instant je l'ai fait à la main, read de x chars et recherche via petit algo, ça marche bien, maintenant si quelqu'un trouve un jour comment utiliser search sur les flux, ça m'intéresse.


 
Le seul moyen c de lire à partir du flux, de stocker ce qui est lu est d'utiliser search sur ce qui a été stocké.


---------------
Le Tyran
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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