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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°551642
antsite
Je me souviens
Posté le 27-10-2003 à 15:55:16  profilanswer
 

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

mood
Publicité
Posté le 27-10-2003 à 15:55:16  profilanswer
 

n°551656
husiana
Posté le 27-10-2003 à 16:06:07  profilanswer
 

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
n°551659
husiana
Posté le 27-10-2003 à 16:08:35  profilanswer
 

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
n°551660
LetoII
Le dormeur doit se réveiller
Posté le 27-10-2003 à 16:08:55  profilanswer
 

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
n°551674
antsite
Je me souviens
Posté le 27-10-2003 à 16:22:15  profilanswer
 

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:

n°551770
nraynaud
lol
Posté le 27-10-2003 à 18:15:29  profilanswer
 

à 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
n°553506
antsite
Je me souviens
Posté le 29-10-2003 à 13:43:58  profilanswer
 

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

n°553674
petit prin​ce
Dessine moi un mouton :)
Posté le 29-10-2003 à 15:51:52  profilanswer
 

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!
n°553680
petit prin​ce
Dessine moi un mouton :)
Posté le 29-10-2003 à 15:56:59  profilanswer
 

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!
n°553682
husiana
Posté le 29-10-2003 à 15:59:08  profilanswer
 

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
mood
Publicité
Posté le 29-10-2003 à 15:59:08  profilanswer
 

n°553683
husiana
Posté le 29-10-2003 à 15:59:42  profilanswer
 

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
n°553686
LetoII
Le dormeur doit se réveiller
Posté le 29-10-2003 à 16:02:15  profilanswer
 

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
n°553695
husiana
Posté le 29-10-2003 à 16:04:23  profilanswer
 

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


---------------
http://husiana.myftp.org/phpsysinfo
n°554448
antsite
Je me souviens
Posté le 30-10-2003 à 13:26:11  profilanswer
 

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
n°554459
LetoII
Le dormeur doit se réveiller
Posté le 30-10-2003 à 13:43:58  profilanswer
 

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
n°554464
nraynaud
lol
Posté le 30-10-2003 à 13:52:09  profilanswer
 

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
n°554470
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-10-2003 à 13:56:46  profilanswer
 

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)
n°554476
LetoII
Le dormeur doit se réveiller
Posté le 30-10-2003 à 14:07:36  profilanswer
 

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
n°554532
nraynaud
lol
Posté le 30-10-2003 à 15:00:00  profilanswer
 

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

n°554556
LetoII
Le dormeur doit se réveiller
Posté le 30-10-2003 à 15:21:15  profilanswer
 

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
n°554601
LetoII
Le dormeur doit se réveiller
Posté le 30-10-2003 à 15:55:14  profilanswer
 

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
n°554669
LetoII
Le dormeur doit se réveiller
Posté le 30-10-2003 à 16:38:50  profilanswer
 

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
n°554715
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-10-2003 à 16:57:23  profilanswer
 

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
n°555145
husiana
Posté le 31-10-2003 à 09:04:10  profilanswer
 

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


---------------
http://husiana.myftp.org/phpsysinfo
n°555185
VisualC++
J'va y penser ...
Posté le 31-10-2003 à 09:54:35  profilanswer
 

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.

n°555196
husiana
Posté le 31-10-2003 à 10:09:40  profilanswer
 

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


---------------
http://husiana.myftp.org/phpsysinfo
n°555221
LetoII
Le dormeur doit se réveiller
Posté le 31-10-2003 à 10:23:55  profilanswer
 

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
n°556014
petit prin​ce
Dessine moi un mouton :)
Posté le 01-11-2003 à 02:15:55  profilanswer
 

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!
n°556058
antsite
Je me souviens
Posté le 01-11-2003 à 10:49:57  profilanswer
 

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.

n°557511
LetoII
Le dormeur doit se réveiller
Posté le 03-11-2003 à 12:57:12  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[Dbase] Ouvrir un fichier .ndx[C++]Insérer une ligne dans un fichier
Codes à barres, recherche de spécifs ...commande dos pour supprimer fichier en utilisation
Comment déclare t on une chaine de caractere ?Comment sont gérés les sites dynamiques par les moteurs de recherche?
[recherche] une meilleure solution que les patch IPSObtenir le nombre total d'enregistrement d'un fichier mdb
Moteur de recherche interne script ???Accés fichier dans un répertoire grand-parent
Plus de sujets relatifs à : [C++] Recherche d'une chaine dans un fichier


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