OVH Cloud OVH Cloud

Fichier temporaire ouvert en lecture / ecriture

12 réponses
Avatar
Vincent Lascaux
Bonjour,

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";

file.write(&test[0], test.size());
file.flush();
file.seekg(0);

char buffer[100];
int len = file.readsome(buffer, 100);
buffer[len] = 0;

std::cout << "Has read " << len << " chars: " << buffer << std::endl;
}

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 ?

Merci

--
Vincent

2 réponses

1 2
Avatar
kanze
Franck Branjonneau wrote:
é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].)


Vraiment ?

21.3.4/1.

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

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


Avatar
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
1 2