Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

lecture directe dans un stringstream

5 réponses
Avatar
Marc G
Bonjour,
Je m'explique.
J'ai des classes qui disposent d'une méthode
void Read(std::istream& input)
et je voudrais savoir s'il est possible de lire directement une portion de
fichier connue dans un stringstream pour la soumettre à ces méthodes

Actuellement, je fais :
std::fstream mainfile("the_filename",std::ios::binary | std::ios::in |
std::ios::out);
std::string s;
s.resize(len); // len connue
mainfile.seekp(pos,std::ios_base::beg); // pos connue
mainfile.read(const_cast<char*>(s->data()),len);
std::stringstream input(s);
s.clear();

puis
obj.Read(input);

J'aurais préféré ne pas passer par une string pour lire dans le fichier,
mais je ne trouve pas comment faire.
Merci à vous.
Marc

5 réponses

Avatar
Fabien LE LEZ
On Sun, 7 Sep 2008 14:39:32 +0200, "Marc G" :

std::fstream mainfile("the_filename",std::ios::binary | std::ios::in |
std::ios::out);



Quand on se retrouve avec tant de "std::" dans la même ligne, c'est
signe qu'il faut mettre un "using namespace std;" au début de la
fonction.

[...]
std::stringstream input(s);
s.clear();



J'écrirais plutôt "istrinstream input (s);" sans le "clear()".

puis
obj.Read(input);



J'admets que ça fait beaucoup de copies dans tous les sens.
Est-ce vraiment gênant ?
Ne peux-tu pas "ranger" ce code inélégant dans une fonction à part,
histoire que tout soit bien propre ?

Je vois bien une solution pour éviter toutes ces copies, mais je suis
absolument incapable de prévoir si le programme ira plus ou moins
vite.

La solution en question est de créer ton propre istream, avec ton
propre streambuf, qui se contente de passer les ordres à
mainfile.rdbuf(), tout en arrêtant la lecture au bout de "len"
caractères.
Je ne me suis jamais vraiment attaqué à ces méthodes, du coup je ne
suis pas forcément de bon conseil.

Mais d'une manière générale, rappelle-toi la règle d'or du
programmeur : "if it ain't broke, don't fix it".
Avatar
Marc G
> La solution en question est de créer ton propre istream, avec ton
propre streambuf, qui se contente de passer les ordres à
mainfile.rdbuf(), tout en arrêtant la lecture au bout de "len"
caractères.
Je ne me suis jamais vraiment attaqué à ces méthodes, du coup je ne
suis pas forcément de bon conseil.



en comparant les vitesses d'exécution entre une lecture directe via les API
Win32 et les méthodes
de la STL, je trouve des écarts d'efficacité "hallucinants" (rapport de 1 à
20 environ)
Peut-être que je ne sais pas bien paramétrer l'utilisation des stream..
=> finalement, je me suis créé ma propre classe CBuffer pour lire et écrire
dans les fichiers en utilisant un tampon.
J'y ai mis le minimum nécessaire lié à l'utilisation que j'en fais, et ça va
beaucoup plus vite...

Merci de ta réponse.
Marc
Avatar
Fabien LE LEZ
On Mon, 8 Sep 2008 11:44:25 +0200, "Marc G" :

en comparant les vitesses d'exécution entre une lecture directe via les API
Win32 et les méthodes
de la STL, je trouve des écarts d'efficacité "hallucinants" (rapport de 1 à
20 environ)



Quel compilateur utilises-tu ?
J'ai moi aussi constaté de tels écarts, mais avec un très vieux
compilo (Borland C++ 5.02).
Avatar
Marc G
j'utilise CPP Builder 2007
mais je ne crois pas que le compilateur soit en cause, plutôt éventuellement
la version de la stl implémentée.
Quand je regarde le code de la stl, je comprends un peu pourquoi ça rame.
Franchement, quand la vitesse de lecture est importante, il est préférable
de gérer soit même les opérations de lecture/écriture,
d'autant que ce n'est pas la partie la plus obscure de windows :-)
La classe de buffer que j'ai écrite n'est pas extraordinaire, mais en moins
de 100 lignes de code,
elle fait ce qu'elle a a faire...


"Fabien LE LEZ" a écrit dans le message de
news:
On Mon, 8 Sep 2008 11:44:25 +0200, "Marc G" :

en comparant les vitesses d'exécution entre une lecture directe via les
API
Win32 et les méthodes
de la STL, je trouve des écarts d'efficacité "hallucinants" (rapport de 1
à
20 environ)



Quel compilateur utilises-tu ?
J'ai moi aussi constaté de tels écarts, mais avec un très vieux
compilo (Borland C++ 5.02).



Avatar
Fabien LE LEZ
On Mon, 8 Sep 2008 15:12:20 +0200, "Marc G" :

Note : merci d'écrire en français, c'est-à-dire, de haut en bas.

j'utilise CPP Builder 2007
mais je ne crois pas que le compilateur soit en cause, plutôt éventuellement
la version de la stl implémentée.



C'est fort possible. Comme je l'ai dit, j'ai pu constater que
BC++ 5.02 était très mauvais de ce côté, et comme Borland a plus ou
moins abandonné le C++, il est possible qu'ils n'aient pas amélioré
leur bibliothèque standard.

Il serait intéressant de tester ton code (avec iostream) sur un
compilo moderne comme g++ 4.x ou Visual C++ 2008 express (tous deux
gratuits).