OVH Cloud OVH Cloud

Copie de char[] vers std::string

9 réponses
Avatar
Michael
Bonsoir à tous,

en cette heure plus que matinale, je bloque sur ce problème vraiment tout
con:

comment copier le contenu de ceci:
unsigned int file_size = //blabla;
unsigned char *buffer = new unsigned char[file_size];

vers cela:
std::string encode;

J'ai essayé ça, qui bien sûr ne fonctionne pas:
std::copy(&buffer[0],&buffer[file_size],encode.begin());

Merci d'avance!

Mike

9 réponses

Avatar
Michael
comment copier le contenu de ceci:
unsigned int file_size = //blabla;
unsigned char *buffer = new unsigned char[file_size];

vers cela:
std::string encode;

J'ai essayé ça, qui bien sûr ne fonctionne pas:
std::copy(&buffer[0],&buffer[file_size],encode.begin());

Merci d'avance!

Mike



Pffff

Faut que je me couche moi...

2' de réflexion pour ça:

std::copy(&buffer[0],&buffer[file_size],back_inserter(encode));

Merci quand même ;-)

Avatar
Loïc Joly
Michael wrote:

comment copier le contenu de ceci:
unsigned int file_size = //blabla;
unsigned char *buffer = new unsigned char[file_size];

vers cela:
std::string encode;

J'ai essayé ça, qui bien sûr ne fonctionne pas:
std::copy(&buffer[0],&buffer[file_size],encode.begin());

Merci d'avance!

Mike




Pffff

Faut que je me couche moi...

2' de réflexion pour ça:

std::copy(&buffer[0],&buffer[file_size],back_inserter(encode));


Dans certains cas, le code suivant marche aussi :

std::string encode(&buffer[0],&buffer[file_size]);

--
Loïc


Avatar
Jean-Sebastien Mouret
Loïc Joly writes:

Michael wrote:

comment copier le contenu de ceci:
unsigned int file_size = //blabla;
unsigned char *buffer = new unsigned char[file_size];

vers cela:
std::string encode;

J'ai essayé ça, qui bien sûr ne fonctionne pas:
std::copy(&buffer[0],&buffer[file_size],encode.begin());

Merci d'avance!

Mike

Pffff

Faut que je me couche moi...
2' de réflexion pour ça:
std::copy(&buffer[0],&buffer[file_size],back_inserter(encode));


Dans certains cas, le code suivant marche aussi :

std::string encode(&buffer[0],&buffer[file_size]);



et meme
std::string encode(buffer, buffer + file_size);

--
js



Avatar
kanze
Loïc Joly wrote:
Michael wrote:

comment copier le contenu de ceci:
unsigned int file_size = //blabla;
unsigned char *buffer = new unsigned char[file_size];

vers cela:
std::string encode;

J'ai essayé ça, qui bien sûr ne fonctionne pas:
std::copy(&buffer[0],&buffer[file_size],encode.begin());


Faut que je me couche moi...

2' de réflexion pour ça:

std::copy(&buffer[0],&buffer[file_size],back_inserter(encode));


Dans certains cas, le code suivant marche aussi :

std::string encode(&buffer[0],&buffer[file_size]);


Dans prèsque tous les cas, ça marche. Mais c'est un comportement
indéfini quand même. Essaie :

std::string encode( buffer, buffer + file_size ) ;

(qui lui est garantie par la norme).

--
James Kanze GABI Software http://www.gabi-soft.fr
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
drkm
writes:

Loïc Joly wrote:

std::string encode(&buffer[0],&buffer[file_size]);


Dans prèsque tous les cas, ça marche. Mais c'est un comportement
indéfini quand même. Essaie :

std::string encode( buffer, buffer + file_size ) ;

(qui lui est garantie par la norme).


Tu veux parler du fait d'accéder à l'élément one-past the end ? Je
pensais que c'était légal si tout ce qu'on faisait était d'en prendre
l'adresse.

--drkm


Avatar
Vincent Lascaux
std::string encode(&buffer[0],&buffer[file_size]);


Dans prèsque tous les cas, ça marche. Mais c'est un comportement
indéfini quand même. Essaie :

std::string encode( buffer, buffer + file_size ) ;

(qui lui est garantie par la norme).


Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
Tu peux expliquer pourquoi le premier code a un comportement indéfini ?

--
Vincent


Avatar
Gabriel Dos Reis
"Vincent Lascaux" writes:

| > > std::string encode(&buffer[0],&buffer[file_size]);
| >
| > Dans prèsque tous les cas, ça marche. Mais c'est un comportement
| > indéfini quand même. Essaie :
| >
| > std::string encode( buffer, buffer + file_size ) ;
| >
| > (qui lui est garantie par la norme).
|
| Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?

Pas en C++.

-- Gaby
Avatar
Michel Michaud
Dans le message ,
"Vincent Lascaux" writes:
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est
un T[]) ?


Pas en C++.


Et ce, même si BS l'utilise toujours dans son livre (je lui avais
fait la remarque et il était un peu faché je crois que ce soit
vraiment le cas -- après vérification auprès des spécialistes de la
norme--, mais il ne voulait pas introduire l'arithmétique de pointeur
avant son exemple). Il y a une explication complète sur son site...

(N.B. Il ne me reste qu'à lire 224 messages avant de reprendre tout
mon retard sur fclc++... je vais y arriver :-))

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


Avatar
kanze
Vincent Lascaux wrote:
std::string encode(&buffer[0],&buffer[file_size]);


Dans prèsque tous les cas, ça marche. Mais c'est un
comportement indéfini quand même. Essaie :

std::string encode( buffer, buffer + file_size ) ;

(qui lui est garantie par la norme).


Je croyais que &buffer[i] valait forcément buffer+i (si buffer
est un T[]) ?


C'est vrai pour une définition limitée de valoir. Si les deux
expressions sont valable, elles se valent.

Tu peux expliquer pourquoi le premier code a un comportement
indéfini ?


Parce que l'expression buffer[file_size] déréférence un derrier
la fin du tableau, et qu'elle a donc un comportement indéfini.
Et que quoique tu en fasses ensuite ne peut enlever ce
comportement indéfini.

Note qu'en C99, ils ont modifié la définition de l'opérateur [],
pour que son comportement dépend de ce qu'on en fait avec le
résultat. Ce qui poserait un réel problème en cas de surcharge
par l'utilisateur.

--
James Kanze GABI Software http://www.gabi-soft.fr
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