J'utilise un fichier temporaire pour y écrire pas mal d'info, avant de le
relire pour les traiter. J'utilise un fstream pour cela, mais celà ne
fonctionne pas comme je l'esperais...
Pourquoi est ce que le code suivant s'entête à écrire "Has read 0 chars" ?
#include <fstream>
#include <iostream>
int main()
{
std::fstream file("temp.tmp", std::ios_base::in | std::ios_base::out |
std::ios_base::trunc | std::ios_base::binary);
std::string test = "Une chaine de caractères";
La seule solution que j'ai trouvé consiste à fermer et à réouvrir le
fichier... Je ne trouve vraiment pas ca très propre. Est ce un bug de Visual
Studio, ou est ce le comportement prévu par la norme ?
L'expression test.data() existe exactement pour ce genre d'utilisation. L'adresse qu'il renvoie doit désigner un tableau contigu des caractères. (Mais l'adresse qu'il renvoie n'est pas forcément la même que &test[0].)
Returns: If pos < size(), returns data()[pos]. [...]
Ce qui est une erreur évidente. (Pour commencer, la version non-const ne pourrait pas renvoyer data()[pos], parce que data()[pos] est const.) Voir DR 259. La version corrigée se lit :
Returns: [...] *(begin() + pos)
-- James Kanze GABI Software 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
Franck Branjonneau wrote:
kanze@gabi-soft.fr écrivait:
L'expression test.data() existe exactement pour ce genre
d'utilisation. L'adresse qu'il renvoie doit désigner un
tableau contigu des caractères. (Mais l'adresse qu'il
renvoie n'est pas forcément la même que &test[0].)
Returns: If pos < size(), returns data()[pos]. [...]
Ce qui est une erreur évidente. (Pour commencer, la version
non-const ne pourrait pas renvoyer data()[pos], parce que
data()[pos] est const.) Voir DR 259. La version corrigée se
lit :
Returns: [...] *(begin() + pos)
--
James Kanze GABI Software
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
L'expression test.data() existe exactement pour ce genre d'utilisation. L'adresse qu'il renvoie doit désigner un tableau contigu des caractères. (Mais l'adresse qu'il renvoie n'est pas forcément la même que &test[0].)
Returns: If pos < size(), returns data()[pos]. [...]
Ce qui est une erreur évidente. (Pour commencer, la version non-const ne pourrait pas renvoyer data()[pos], parce que data()[pos] est const.) Voir DR 259. La version corrigée se lit :
Returns: [...] *(begin() + pos)
-- James Kanze GABI Software 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
Gabriel Dos Reis
Jean-Marc Bourguet writes:
| Gabriel Dos Reis writes: | | > writes: | > | > [...] | > | > | > C'est plut un comportement indéfini si je fais | > | | > | > file.write(test.data(), test.size()); | > | | > | > ? | > | | > | Pas du tout. L'expression test.data() existe exactement pour ce | > | genre d'utilisation. L'adresse qu'il renvoie doit désigner un | > | tableau contigu des caractères. (Mais l'adresse qu'il renvoie | > | n'est pas forcément la même que &test[0].) | > | > J'ai du mal à trouver d'ou vient cette garantie -- il faut dire qu'il | > est tard et je suis fatigué. Aussi, j'apprecierais une référence à la | > norme où je peux trouver cette garantie. | | C'est a l'endroit le plus evident. Tu dois etre effectivement bien | fatigue. | | 21.3.6/3: | | If size() is nonzero, the member [data()] returns a pointer to the | initial element of an array whose first size() elements equal the | corresponding elements of the string constrolled by *this. If size() | is zero, the member returns a non-null pointer that is copyable and | can have zero added to it.
OK. merci.
-- Gaby
Jean-Marc Bourguet <jm@bourguet.org> writes:
| Gabriel Dos Reis <gdr@integrable-solutions.net> writes:
|
| > kanze@gabi-soft.fr writes:
| >
| > [...]
| >
| > | > C'est plut un comportement indéfini si je fais
| > |
| > | > file.write(test.data(), test.size());
| > |
| > | > ?
| > |
| > | Pas du tout. L'expression test.data() existe exactement pour ce
| > | genre d'utilisation. L'adresse qu'il renvoie doit désigner un
| > | tableau contigu des caractères. (Mais l'adresse qu'il renvoie
| > | n'est pas forcément la même que &test[0].)
| >
| > J'ai du mal à trouver d'ou vient cette garantie -- il faut dire qu'il
| > est tard et je suis fatigué. Aussi, j'apprecierais une référence à la
| > norme où je peux trouver cette garantie.
|
| C'est a l'endroit le plus evident. Tu dois etre effectivement bien
| fatigue.
|
| 21.3.6/3:
|
| If size() is nonzero, the member [data()] returns a pointer to the
| initial element of an array whose first size() elements equal the
| corresponding elements of the string constrolled by *this. If size()
| is zero, the member returns a non-null pointer that is copyable and
| can have zero added to it.
| Gabriel Dos Reis writes: | | > writes: | > | > [...] | > | > | > C'est plut un comportement indéfini si je fais | > | | > | > file.write(test.data(), test.size()); | > | | > | > ? | > | | > | Pas du tout. L'expression test.data() existe exactement pour ce | > | genre d'utilisation. L'adresse qu'il renvoie doit désigner un | > | tableau contigu des caractères. (Mais l'adresse qu'il renvoie | > | n'est pas forcément la même que &test[0].) | > | > J'ai du mal à trouver d'ou vient cette garantie -- il faut dire qu'il | > est tard et je suis fatigué. Aussi, j'apprecierais une référence à la | > norme où je peux trouver cette garantie. | | C'est a l'endroit le plus evident. Tu dois etre effectivement bien | fatigue. | | 21.3.6/3: | | If size() is nonzero, the member [data()] returns a pointer to the | initial element of an array whose first size() elements equal the | corresponding elements of the string constrolled by *this. If size() | is zero, the member returns a non-null pointer that is copyable and | can have zero added to it.