OVH Cloud OVH Cloud

Lire n caractères dans un istream vers une string

6 réponses
Avatar
Clément
Bonjour,

J'ai une question toute bête mais je ne parviens pas à trouver la réponse
sur google/dejanews...

Je voudrais lire n (connu) caractères depuis un istream et mettre tout ça
dans une string. J'ai bien pensé à faire un truc comme ca :

char * buf = new char [n];
ifs.read(buf, n);
std::string str(buf, n);

Mais c'est pas très C++ et pas très "propre" (j'alloue n octets pour pas
grand chose).

Comment faire pour ne pas passer par un char* ?

Merci d'avance.
Clément.

6 réponses

Avatar
Fabien LE LEZ
On Fri, 5 Aug 2005 11:30:53 +0200, "Clément" :

char * buf = new char [n];


Déjà, mauvais réflexe ici.
Si tu as besoin d'un char* pour une raison quelconque (ça arrive
souvent quand on travaille avec des bibliothèques prévues pour le C),
il est généralement plus facile d'utiliser std::vector<> :

std::vector<char> buf (n);
une_fonction_quelconque (&buf[0]);

Avatar
Clément
Déjà, mauvais réflexe ici.
Si tu as besoin d'un char* pour une raison quelconque (ça arrive
souvent quand on travaille avec des bibliothèques prévues pour le C),
il est généralement plus facile d'utiliser std::vector<> :

std::vector<char> buf (n);
une_fonction_quelconque (&buf[0]);



OK merci du conseil... Je ne savais pas qu'on était sûr que les éléments
d'un vector se suivaient en mémoire...

Avatar
Fabien LE LEZ
On Fri, 5 Aug 2005 12:02:17 +0200, "Clément"
:

Je ne savais pas qu'on était sûr que les éléments
d'un vector se suivaient en mémoire...


Pendant longtemps, c'était vrai en pratique, parce qu'on ne
connaissait aucun autre moyen sérieux d'implémenter la norme.
Depuis peu, c'est explicite dans la norme C++.

Avatar
Clément
"Fabien LE LEZ" a écrit dans le message de news:

On Fri, 5 Aug 2005 12:02:17 +0200, "Clément"
:

Je ne savais pas qu'on était sûr que les éléments
d'un vector se suivaient en mémoire...


Pendant longtemps, c'était vrai en pratique, parce qu'on ne
connaissait aucun autre moyen sérieux d'implémenter la norme.
Depuis peu, c'est explicite dans la norme C++.


OK, mais est-ce vraiment respecté dans la plupart des compilos (genre VC++

2003) ?
Et puis, si je comprends bien, on n'a presque plus à utiliser "new", à part
pour le polymorphisme (ce qui est déjà bcp, tu me diras)...

Et sinon, pour ma question, y'a pas d'autre moyen que de passer par un
vector ? Les "char" ne sont pas sensés se succéder en mémoire, pour une
"string" ? Parce que si c'est le cas, je passe &str[0]...


Avatar
Michel Michaud
Dans le message 42f35e31$0$15053$,
"Fabien LE LEZ" a écrit dans le message de
news:
On Fri, 5 Aug 2005 12:02:17 +0200, "Clément"
:

Je ne savais pas qu'on était sûr que les éléments
d'un vector se suivaient en mémoire...


Pendant longtemps, c'était vrai en pratique, parce qu'on ne
connaissait aucun autre moyen sérieux d'implémenter la norme.
Depuis peu, c'est explicite dans la norme C++.


OK, mais est-ce vraiment respecté dans la plupart des compilos

(genre VC++ 2003) ?


C'était respecté partout quand on l'a rendu officielle. En fait,
il semble que c'était évidemment ce qu'on pensait et que c'est
pourquoi on avait oublié de l'écrire explicitement dans la norme.

Et puis, si je comprends bien, on n'a presque plus à utiliser
"new", à part pour le polymorphisme (ce qui est déjà bcp, tu me
diras)...


Presque. On a besoin de new si l'on veut contrôler la durée de vie
des objets explicitement (c'est rare, mais ça arrive).

Et sinon, pour ma question, y'a pas d'autre moyen que de passer par
un vector ? Les "char" ne sont pas sensés se succéder en mémoire,
pour une "string" ? Parce que si c'est le cas, je passe &str[0]...


Non, là, c'est exprès que ce n'est pas obligatoire.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Falk Tannhäuser
Clément wrote:

Je voudrais lire n (connu) caractères depuis un istream et mettre tout ça
dans une string. J'ai bien pensé à faire un truc comme ca :


En supposant que "ifs" est un std::istream et "str" un std::string :
ifs >> std::setw(n) >> str;

Cela lira tout au plus n caractères, mais la lecture s'arrête à la fin
du fichier ou à une espace (cf. § 21.3.7.9/1). Si tu n'as pas d'espaces
dans les chaînes à lire, cela devrait faire ce que tu veux. Sinon je ne
vois rien de mieux que ce qui a déjà été proposé.

Falk