|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On 24 fév, 13:55, James Kanze <james.ka...@gmail.com> 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, '\0' ) ; > 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. |
|
![]() |
| Outils de la discussion | |
|
|