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

ecriture et lecture de std::string

33 réponses
Avatar
Marc G
je ne sais pas trop quelle méthode choisir pour écrire/lire des chaînes dans
un fichier binaire

1) La première solution :

// pour écrire
// output est un std::fstream&

std::string UneChaine="coucou";
std::size_t len=UneChaine.size();
char const* contents=UneChaine.data();
output.write((char*)&len,sizeof(std::size_t));
output.write((char*)&contents,len);

// pour lire
// input est un std::fstream&

std::size_t len;
input.read((char*)&len,sizeof(std::size_t));
char *contents=new char[len+1];;
input.read((char*)&contents,len);
contents[len]='\0';
UneChaine=std::string(contents);
delete[] contents;

je trouve ça très lourd juste pour récupérer le contenu de la string
(j'ai l'impression de réserver 2 fois inutilement l'espace pour contenir la
chaîne !)

2) la deuxième solution

output << UneChaine

input >> UneChaine

c'est-à-dire que j'écris en mode texte dans mon fichier binaire (a priori,
ça devrait pas poser de problème ?)

Quels sont vos conseils ?
Quels sont les avantages/inconvénients de chaque méthode et est-il possible
d'améliorer la première ?

Merci à vous.
Marc

3 réponses

1 2 3 4
Avatar
Jean-Marc Bourguet
"Ael Rowan Terence" writes:

"Fabien LE LEZ" a écrit dans le message de
news:
On Tue, 6 Nov 2007 14:18:00 +0100, "Marc G" :

char const* contents=UneChaine.data();
output.write((char*)&len,sizeof(std::size_t));


Résultat indéfini : les octets seront bien écrits, mais on ne sait pas
dans quel ordre.



Mais une chose me surprend, pourquoi attacher tant d'importance à l'ordre
des des octets, tout en ignorant l'ordre des bits ?


L'ordre a de l'importance quand on accede individuellement a des parties
d'un objet plus grand et que des systemes differents utilisent des ordres
differents.

Si on manipule des bits individuellement -- c'est parfois le cas quand on
s'occupe de transmission -- il faut s'occuper de leur ordre egalement.
C'est generalement transparent parce que seule les couches qui s'occupent
de cette transmission ont a etre au courant, ce quel que soit l'ordre des
bits utilises dans les systemes sources, destination et pour la
transmission.

Ce qui est particulier dans l'ordre des bytes, c'est que la decomposition
est beaucoup plus visible. Les couchent s'occupant de la transmission ne
peuvent pas changer cet ordre de maniere transparente car les operations a
faire pour reordonner dependent de l'interpretation a faire des donnees.

Le probleme se pose de temps en temps pour les bits. Cela arrive si decrit
une serie de bits en donnant un numero (plutot que d'indiquer un masque) et
que les deux cotes de la transmission interprete ce numero de maniere
differente.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Alexandre BACQUART
James Kanze wrote:

En ce qui concerne la longueur d'une chaîne, j'ai du mal à
concevoir un cas où 2^32-1 ne suffit pas.


Une chaîne ADN ? :) Quand on travaille dans un organisme susceptible de
traiter ce genre d'informations, le problème de la conception de la DB
doit avoir d'autres proportions que simplement "natif vs texte"...


--
Alex

Avatar
Fabien LE LEZ
On Sat, 10 Nov 2007 01:47:50 +0100, Alexandre BACQUART :

En ce qui concerne la longueur d'une chaîne, j'ai du mal à
concevoir un cas où 2^32-1 ne suffit pas.


Une chaîne ADN ? :)


Même là, je crois qu'on ne dépasse pas les 4 milliards.


1 2 3 4