commande pour lire un string

commande pour lire un string - C++ - Programmation

Marsh Posté le 09-12-2004 à 17:25:56    

Salut à tous,
je suis en train de me taper la tete contre les murs !!!
Y a t il une commande c++ toute simple permettant d'extraire un ligne d'un long string.
 
Je m'explique, j'ai mis un fichier txt en memoire (il fait plusieur milier de ligne) et je voudrais maintenant le scruter ligne par ligne.
Je l'ai placer dans une variable de type std::string.
 
Merci pour votre aide
a+

Reply

Marsh Posté le 09-12-2004 à 17:25:56   

Reply

Marsh Posté le 09-12-2004 à 17:29:31    

tu ouvres le fichier avec un ifstream, et tu fais un getline() dans une string....
 
par exemple:
http://www.softadvances.com/stl/if [...] ample.html

Reply

Marsh Posté le 09-12-2004 à 17:30:47    

oui mais non car je dois acceder des millier de fois à mes données, et c trop long comme ça!
C'est pour cela que je l'ai passe en memoire.

Reply

Marsh Posté le 09-12-2004 à 17:36:21    

si tu as besoin de pouvoir accéder aux lignes par un index, tu peux faire un vector<string>, ou repérer le début et fin de ligne en faisant des find(), et mettre en vector<> une classe qui style:
class LineMarker
{
public:
   size_t Start,Length;
}
 
et pour accéder à une ligne, où tu feras un:
 
string LineTemp=StringFichier.substr( maligne.Start, maligne.Length ).
 
mais je serais plus pour un vector<string>. (indexage plus rapide, et possibilitée de modifier chaque ligne indépendamment sans se faire chier)
 
bref tu vois comme tu veux.


Message édité par bjone le 09-12-2004 à 17:38:02
Reply

Marsh Posté le 09-12-2004 à 17:41:17    

ouais alors attend, j'ai pas tt suivi !
moi j'ai un truc comme ça :
std::string info; //qui contient ttes les lignes de mon fichier
 
et ensuite pour acceder à la premiere ligne par ex je fais quoi ?

Reply

Marsh Posté le 09-12-2004 à 18:05:23    

tu parses avec des find().
d'oû plustôt lire le fichier ligne par ligne, et mettre chaque ligne dans un vector<string>.

Reply

Marsh Posté le 10-12-2004 à 16:07:20    

un string   :??:    :??:    :??:    :??:    :??:    :??:    :??:    :??:

Reply

Marsh Posté le 10-12-2004 à 17:26:38    

Donc tu charges tout en mémoire, puis tu parcours tout le buffer à la recherche des lignes, puis tu extrais chaque ligne puis tu les stockes. T'es sûr que c'est beaucoup plus rapide qu'une lecture directe avec des getline ? Bosse en release et joue avec reserve().


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-01-2005 à 23:40:06    

Tu utilises les strstream, c'est des buffers en memoire.
 
std::strstream TonStreamEnMemoire;
 
TonStreamEnMemoire<< TonBuffer;
 
char lLineBuffer[255];
TonStreamEnMemoire.getLine(lLineBuffer, 255);
 
Voila

Reply

Marsh Posté le 26-01-2005 à 23:43:41    

Et il te faut pas un freeze() quelque part pour faire tourner ce code qui n'est (plus) du C++ ?
 
Il ne faut plus utiliser strstream (instable, un peu incompatible entre certaines implémentations, et compliqué à utiliser). Il faut utiliser stringstream de nos jours...
A part ça, joli up...

Reply

Marsh Posté le 26-01-2005 à 23:43:41   

Reply

Marsh Posté le 26-01-2005 à 23:44:18    

mastertnt a écrit :

Tu utilises les strstream, c'est des buffers en memoire.
 
std::strstream TonStreamEnMemoire;
 
TonStreamEnMemoire<< TonBuffer;
 
char lLineBuffer[255];
TonStreamEnMemoire.getLine(lLineBuffer, 255);
 
Voila


tu sors toi :o
 (t'as tout faux également)

Reply

Marsh Posté le 26-01-2005 à 23:51:14    

Non, faut pas de freeze pour que ca marche mais c vrai c plus chic d'utiliser les stringstream
 
Il est ou le probleme je dormirais moins con, Taz ???


Message édité par mastertnt le 27-01-2005 à 00:13:25
Reply

Marsh Posté le 26-01-2005 à 23:54:01    

n'utilise ni strstream ni std::istream::getline mais std::stringstream et std::getline

Reply

Marsh Posté le 26-01-2005 à 23:57:09    

Ca n'empeche le code de marcher, c'est le but final non ?

Reply

Marsh Posté le 26-01-2005 à 23:58:34    

ton code ne marche pas d'une part. D'autre part, les char* sont à proscrire.

Reply

Marsh Posté le 27-01-2005 à 00:05:05    

Ben si mon code marche je suis désolé pour toi. Sous Linux, je sais pas, j'ai pas testé ce que tu as fait probablement car ca sent le pingouino à plein nez mais sous Windows avec VC 7.1 ca marche nickel. si tu veux je t'envoie le code demain :)

Reply

Marsh Posté le 27-01-2005 à 00:07:36    

Même en oubliant le std::ends comme tu l'as fait ?

Reply

Marsh Posté le 27-01-2005 à 00:11:05    

Affirmative, le pb de strstream avec std::ends et la mémoire n'apparait qu'avec la fonction str(), si je ne m'abuse


Message édité par mastertnt le 27-01-2005 à 00:14:26
Reply

Sujets relatifs:

Leave a Replay

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