Manipuler une sous zone d'un ifstream avec un autre ifstream

Le
philippe.lrx
Bonjour,

J'ai ouvert un fichier avec std::ifstream, je localise un zone bien
précise dans le fichier avec std::ios::pos_type et une taille en
octets.

J'aimerais ouvrir un autre std::ifstream ou std::istream sur cette
zone bien définie pour là manipuler comme si c'était un fichier
normal, l'objet qui utilisera le std::istream doit croire manipuler un
fichier normal, je ne veux surtout pas charger la zone en mémoire qui
peux être éventuellement très grosse.

Ce genre de chose est-il possible et si oui comment ?

Merci.
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
James Kanze
Le #1109995
On Feb 24, 10:32 am, wrote:
J'ai ouvert un fichier avec std::ifstream, je localise un zone
bien précise dans le fichier avec std::ios::pos_type et une
taille en octets.

J'aimerais ouvrir un autre std::ifstream ou std::istream sur
cette zone bien définie pour là manipuler comme si c'était un
fichier normal, l'objet qui utilisera le std::istream doit
croire manipuler un fichier normal, je ne veux surtout pas
charger la zone en mémoire qui peux être éventuellement très
grosse.

Ce genre de chose est-il possible et si oui comment ?


Deux solutions, selon la taille. La plus simple, sans doute, si
la taille n'est pas trop grosse, c'est de lire toute la section
d'un coup dans un std::string, puis utiliser std::istringstream.
Pour ce faire, on peut se servir de la contiguïté de la mémoire
dans std::string. Ce n'est pas actuellement garantie, mais elle
le sera dans la prochaine version de la norme, et dans les
faits, toutes les implémentations actuelles utilisent de la
mémoire contigue. Donc :

std::string buffer( taille, '' ) ;
file.read( &buffer[ 0 ], taille ) ;
std::string subfile( buffer ) ;

Sinon, un streambuf filtrant pourrait faire l'affaire. Voir mes
articles à http://kanze.james.neuf.fr/articles-fr.html, surtout
le seconde, qui traite prèsqu'exactement ton cas.

Et en passant, tu es bien au courant que si le flux n'est pas en
mode binaire, les seuls streampos valides sont les valeurs
renvoyées par tellg.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

philippe.lrx
Le #1135600
On 24 fév, 13:55, James Kanze
Deux solutions, selon la taille. La plus simple, sans doute, si
la taille n'est pas trop grosse, c'est de lire toute la section
d'un coup dans un std::string, puis utiliser std::istringstream.
Pour ce faire, on peut se servir de la contiguïté de la mémoire
dans std::string. Ce n'est pas actuellement garantie, mais elle
le sera dans la prochaine version de la norme, et dans les
faits, toutes les implémentations actuelles utilisent de la
mémoire contigue. Donc :

std::string buffer( taille, '' ) ;
file.read( &buffer[ 0 ], taille ) ;
std::string subfile( buffer ) ;



Aujourd'hui la taille devient mon problème.

Sinon, un streambuf filtrant pourrait faire l'affaire. Voir mes
articles àhttp://kanze.james.neuf.fr/articles-fr.html, surtout
le seconde, qui traite prèsqu'exactement ton cas.


J'ai passé pas mal de temps sur ton article et ton code, il va falloir
que je potasse le streambuf pour l'instant j'ai du mal à tout
comprendre, mais ça va venir.


Et en passant, tu es bien au courant que si le flux n'est pas en
mode binaire, les seuls streampos valides sont les valeurs
renvoyées par tellg.

J'utilise tellg, j'imagine que tu fais référence à l'autre qui est

tellp.
Dans ma doc (du web) j'ai en résumé : "utiliser tellg pour les flux en
entrée et tellp pour les flux en sortie".
Il n'est pas fait mention de flux binaire ou texte, la définition est
elle fausse ?

Merci.

Publicité
Poster une réponse
Anonyme