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

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

2 réponses
Avatar
philippe.lrx
Bonjour,

J'ai ouvert un fichier avec std::ifstream, je localise un zone bien
pr=E9cise 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=E9finie pour l=E0 manipuler comme si c'=E9tait 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=E9moire qui
peux =EAtre =E9ventuellement tr=E8s grosse.

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

Merci.

2 réponses

Avatar
James Kanze
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

Avatar
philippe.lrx
On 24 fév, 13:55, James Kanze wrote:
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.