string contenant le caractere 0

Le
jeremie fouche
Bonjour

Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). Apres essais avec VC8 et gcc 4.4.0,
il semble que oui, bien que je me sente gêné par cela. A t on la
garantie que le caractère 0 ne scinde pas la chaine à un moment
donné ?
Qu'en pensez vous ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alexandre Bacquart
Le #22398131
On 07/26/2010 11:28 AM, jeremie fouche wrote:
Bonjour

Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). Apres essais avec VC8 et gcc 4.4.0,
il semble que oui, bien que je me sente gêné par cela.



J'ai l'image d'un lion affamé qu'on tenterait de calmer avec de la
laitue en abondance.

A t on la
garantie que le caractère 0 ne scinde pas la chaine à un moment
donné ?
Qu'en pensez vous ?



Qu'un std::vector<char> mange tout ce qui se présente et ne mord pas.

Pourquoi tiens-tu tellement à faire ça ?


--
Alex
Patrick Begou
Le #22398391
jeremie fouche wrote:
Bonjour

Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). Apres essais avec VC8 et gcc 4.4.0 ,
il semble que oui, bien que je me sente gêné par cela. A t on la
garantie que le caractère 0 ne scinde pas la chaine à un moment
donné ?
Qu'en pensez vous ?



La valeur ascii du caractère '0' (le chiffre 0) c'est 48 (et le chiffre '1'
c'est la valeur 49) et celle de '' qui provoque la fin de chaine c'est 0.
Donc a priori il n'y a pas de soucis non plus...
Olivier Miakinen
Le #22398381
Bonjour,

Le 26/07/2010 14:19, Patrick Begou répondait à jeremie fouche :

Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). [...]



La valeur ascii du caractère '0' [...]



C'est toi qui rajoutes des quotes, et qui parles de code ascii. Non
seulement Jérémie ne parlait pas de code ascii (par exemple le code du
caractère '0' en ebcdic n'est pas 48 mais 240), mais surtout il a écrit
en toutes lettres « binaire ». Il était donc évident qu'il voulait
parler d'une valeur binaire nulle.

Cordialement,
--
Olivier
James Kanze
Le #22404541
On Jul 26, 10:28 am, jeremie fouche
Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). Apres essais avec VC8 et gcc 4.4.0,
il semble que oui, bien que je me sente gêné par cela. A t on la
garantie que le caractère 0 ne scinde pas la chaine à un moment
donné ?



Oui et non. Pour un std::string, '' est un caractère comme un
autre (comme il se doit). La seule risque, c'est si tu appelles
c_str() sur la chaîne, pour la passer à une fonction C, par
exemple.

Ça ne vaut pas pour certains compilateurs un peu anciens (genre
VC++ 6.).

Qu'en pensez vous ?



Il n'y a aucun problème avec un '' dans une std::string, au
moins en ce qui concerne le langage et la bibliothèque. Que
quelque chose qui s'appelle std::string ne contient pas de
texte, en revanche, pourrait induire le lecteur en erreur.

--
James Kanze
Fabien LE LEZ
Le #22405891
On Tue, 27 Jul 2010 06:03:09 -0700 (PDT), James Kanze

La seule risque, c'est si tu appelles
c_str() sur la chaîne, pour la passer à une fonction C, par
exemple.



Et encore, ça dépend de la fonction C. Certaines fonctions prennent en
argument un char* + un entier qui indique la longueur.

En gros, si tu as besoin de c_str() seulement, attends-toi à des
problèmes ; si tu utilises c_str() et size() conjointement, ça passera
sans doute.

quelque chose qui s'appelle std::string ne contient pas de
texte, en revanche, pourrait induire le lecteur en erreur.



Il y a des cas où c'est légitime : par exemple, la commande Unix
find -print0
envoie sur stdout une chaîne contenant des ''.
Olivier Miakinen
Le #22406691
Le 27/07/2010 18:14, Fabien LE LEZ a écrit :

quelque chose qui s'appelle std::string ne contient pas de
texte, en revanche, pourrait induire le lecteur en erreur.



Il y a des cas où c'est légitime : par exemple, la commande Unix
find -print0
envoie sur stdout une chaîne contenant des ''.



Oui si les '' étaient les seuls caractères non imprimables. Mais
Jérémie a bien écrit « contenu binaire », la présence de valeurs nulles
n'étant qu'une conséquence du fait qu'il peut contenir n'importe quoi.

La remarque de James est donc parfaitement fondée.

--
Olivier Miakinen
Patrick Begou
Le #22408451
Olivier Miakinen wrote:
Bonjour,

Le 26/07/2010 14:19, Patrick Begou répondait à jeremie fouche :

Peut on utiliser une std::string pour stocker un contenu binaire
(contenant donc des caractères 0). [...]



La valeur ascii du caractère '0' [...]



C'est toi qui rajoutes des quotes, et qui parles de code ascii. Non
seulement Jérémie ne parlait pas de code ascii (par exemple le code du
caractère '0' en ebcdic n'est pas 48 mais 240), mais surtout il a é crit
en toutes lettres « binaire ». Il était donc évident qu'il voul ait
parler d'une valeur binaire nulle.

Cordialement,



Je n'ai pas interprété sa demande comme toi. J'ai compris qu'il voula it stocker
des séries de 0 et de 1 dans une chaine de caratères (pour représen ter
l'écriture binaire d'une valeur) et qu'il y avait confusion entre le ca ratère
'0' et la valeur 0. Pour moi le "caractère 0" comme dit Jérémie, si gnifie bien
qu'il va stocker un caractère alphanumérique. Sinon il aurait parlé de valeur 0.

jeremie fouche wrote:
....

A t on la
garantie que le caractère 0 ne scinde pas la chaine à un moment
donné ?
....



Ma réponse se voulait un simple exemple... mais je ne connais pas le ni veau de
Jérémie en C++, débutant (je peux peut être l'aider) ou expert ( je n'en suis
pas un et il verra que je répond à coté)

Cordialement
James Kanze
Le #22410181
On Jul 27, 5:14 pm, Fabien LE LEZ
On Tue, 27 Jul 2010 06:03:09 -0700 (PDT), James Kanze

>La seule risque, c'est si tu appelles
>c_str() sur la chaîne, pour la passer à une fonction C, par
>exemple.

Et encore, ça dépend de la fonction C. Certaines fonctions prennent e n
argument un char* + un entier qui indique la longueur.

En gros, si tu as besoin de c_str() seulement, attends-toi à des
problèmes ; si tu utilises c_str() et size() conjointement, ça passer a
sans doute.

>quelque chose qui s'appelle std::string ne contient pas de
>texte, en revanche, pourrait induire le lecteur en erreur.

Il y a des cas où c'est légitime : par exemple, la commande Unix
find -print0
envoie sur stdout une chaîne contenant des ''.



Est-ce qu'il fait parti du texte ? Pour le traiter correctement
dans C++, par exemple, il faut ouvrir le fichier en mode binaire
(autrement, c'est un comportement spécifié par l'implémentation,
je crois, si ce n'est pas un comportement indéfini). Dans le cas
de « find -print0 », le '' est en fait une information « hors
bande », choisi exprès parce qu'il ne peut pas faire partie des
données textuelles.

--
James Kanze
Publicité
Poster une réponse
Anonyme