Recherche d'une chaine dans un fichier [C++] - C++ - Programmation
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!
Marsh Posté le 27-10-2003 à 16:08:35
Code :
|
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.
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
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.
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. |
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
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 :
|
...je suis débutant donc ma solution est ptet nulle!
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
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
Marsh Posté le 29-10-2003 à 15:59:42
husiana a écrit :
|
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? |
En même temps un fichier de plus de 2Go vaut mieux pas trop s'amuser à le charger en mémoire
Marsh Posté le 29-10-2003 à 16:04:23
oui mais non...! j'aime pas qd il y a une possibilité que ca plante
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
Marsh Posté le 30-10-2003 à 13:43:58
ANTSite a écrit : alors recentrons un peu le sujet : |
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.
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.
Marsh Posté le 30-10-2003 à 13:56:46
husiana a écrit :
|
MFC
Petit Prince a écrit : une solution un peu bidouille que j'utilise (j'avais pas trouvé mieux mais ça marche tres bien)
|
VCL
Eh les gars, vous avez pas remarqué qu'il parle de STL ?
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
Marsh Posté le 30-10-2003 à 15:00:00
LetoII 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é).
Marsh Posté le 30-10-2003 à 15:21:15
nraynaud a écrit : La vraie doc, on l'a tous, elle est là : |
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...
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.
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é
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
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.
Marsh Posté le 31-10-2003 à 09:04:10
svp svp svp, dites moi pk ne pas faire un getline ?
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.
Marsh Posté le 31-10-2003 à 10:09:40
ReplyMarsh 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
Marsh Posté le 01-11-2003 à 02:15:55
antp a écrit : |
vi j'ai changé entretps
merchi
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.
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é.
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