On Feb 24, 10:32 am, philippe....@gmail.com 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, '\0' ) ;
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:james.kanze@gmail.com
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