Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[std::fstream] mode d'ouverture ...

0 views
Skip to first unread message

grouik

unread,
Apr 19, 2001, 2:02:19 PM4/19/01
to
J'ai ici une question sur les fstreams, et plus particulierement sur les
ofstreams :
voilà donc pour introduire, j'ai ça dans une partie de mon code :

[...]
ofstream O;
O.open(file, ios::in|ios::out|ios::binary|ios::app);
O.seekp(p, ios::beg);
O.write(buff, length);
O.close();
[...]

je voudrais écrire à partir de la position p et au lieu de cela, mon buffer
est écrit à partir de la fin du flot.

J'ai donc par la suite remplacé ios::app par ios::ate et là aucun problème.

Ma question porte justement sur ces flags, quelle est la différence
fondamentale entre ios::ate et ios::app ? serait-ce une sorte protection
pour éviter d'écraser des données par erreur ?

merci d'avance.


Michel Michaud

unread,
Apr 19, 2001, 7:16:09 PM4/19/01
to
"grouik" <super...@superyoupi.cjb.net> a écrit dans le message news:
9bn95v$7lu$1...@wanadoo.fr...

> J'ai ici une question sur les fstreams, et plus particulierement sur
les
> ofstreams :
> voilà donc pour introduire, j'ai ça dans une partie de mon code :
>
> [...]
> ofstream O;
> O.open(file, ios::in|ios::out|ios::binary|ios::app);

Pourquoi un ofstream si tu veux y faire des lectures
aussi ? Voir fstream.

(et en C++ standard, il est plus commun de voir ios_base::...
que le simple ios::)

> O.seekp(p, ios::beg);
> O.write(buff, length);
> O.close();
> [...]
>
> je voudrais écrire à partir de la position p et au lieu de cela, mon<
> buffer
> est écrit à partir de la fin du flot.
>
> J'ai donc par la suite remplacé ios::app par ios::ate et là aucun
> problème.

app indique les écritures se feront toujours à la fin. ate indique
simplement de placer le fichier à la fin après l'ouverture. Si tu
veux faire des seek, ni l'un ni l'autre ne te sont utiles !

--
Michel Michaud
michel....@cstjean.qc.ca
http://www3.sympatico.ca/michel.michaud
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


grouik

unread,
Apr 20, 2001, 7:00:03 AM4/20/01
to
> >
> > [...]
> > ofstream O;
> > O.open(file, ios::in|ios::out|ios::binary|ios::app);
>
> Pourquoi un ofstream si tu veux y faire des lectures
> aussi ? Voir fstream.

parce que je n'ai pas besoin d'y lire quoique ce soit.

>
> app indique les écritures se feront toujours à la fin. ate indique
> simplement de placer le fichier à la fin après l'ouverture. Si tu
> veux faire des seek, ni l'un ni l'autre ne te sont utiles !
>

effectivement, il n'est pas utiles d'en mettre pour l'utilité que j'en ai.

merci pour la réponse.


Gabriel Dos Reis

unread,
Apr 20, 2001, 7:05:30 AM4/20/01
to
"grouik" <super...@superyoupi.cjb.net> writes:

| > >
| > > [...]
| > > ofstream O;
| > > O.open(file, ios::in|ios::out|ios::binary|ios::app);
| >
| > Pourquoi un ofstream si tu veux y faire des lectures
| > aussi ? Voir fstream.
|
| parce que je n'ai pas besoin d'y lire quoique ce soit.

Alors pourquoi ios_base::in ?

Le ios_base::out est également superflu.

-- Gaby

grouik

unread,
Apr 20, 2001, 11:47:33 AM4/20/01
to
"Gabriel Dos Reis" <dos...@cmla.ens-cachan.fr> a écrit dans le message
news: fly9svu...@sel.cmla.ens-cachan.fr...

>
> | > >
> | > > [...]
> | > > ofstream O;
> | > > O.open(file, ios::in|ios::out|ios::binary|ios::app);
> | >
> | > Pourquoi un ofstream si tu veux y faire des lectures
> | > aussi ? Voir fstream.
> |
> | parce que je n'ai pas besoin d'y lire quoique ce soit.
>
> Alors pourquoi ios_base::in ?
>
> Le ios_base::out est également superflu.
>

Le ios_base::out est bien superflu,
mais pour le ios_base::in je vais reposer ma question,
dans la norme, qu'est-ce que ces 2 ouverture sont censé faire

ofstream O(file, ios_base::ate|ios_base::binary);
et
fstream O(file, ios_base::out|ios_base::ate|ios_base::binary);

parce que si je laisse cela telque, mon fichier retourne à une taille de
zéro, et pour garder mon fichier intact, il me faut ajouter ios_base::in
dans les flags. (en fait j'aimerai pouvoir ouvrir mon fichier en écriture
uniquement et en le gardant intact)

Alors, est-ce un bug des classes std inclues dans VC6 ou est-ce normal ?


Michel Michaud

unread,
Apr 20, 2001, 12:57:27 PM4/20/01
to
"grouik" <super...@superyoupi.cjb.net> a écrit dans le message news:
9bpll8$abt$1...@wanadoo.fr...

> dans la norme, qu'est-ce que ces 2 ouverture sont censé faire
>
> ofstream O(file, ios_base::ate|ios_base::binary);
> et
> fstream O(file, ios_base::out|ios_base::ate|ios_base::binary);
>
> parce que si je laisse cela telque, mon fichier retourne à une taille
de
> zéro, et pour garder mon fichier intact, il me faut ajouter
> ios_base::in
> dans les flags. (en fait j'aimerai pouvoir ouvrir mon fichier en
> écriture
> uniquement et en le gardant intact)
>
> Alors, est-ce un bug des classes std inclues dans VC6 ou est-ce
> normal ?

Normal.

Le problème vient probablement de ce que tu veux faire et que
je ne comprends pas bien. Si tu veux ouvrir un fichier existant
et y faire des écritures seulement mais n'importe où (donc avec
des seekp), il te faut quand même un accès en lecture. C'est
comme ça en ISO C++ et en C standard (mode r+).

Je ne crois pas que le ate t'intéresse, donc tu voudras
effectivement :

fstream f(nom, ios_base::in|ios_base::out|ios_base::binary);

ou un ofstream avec ios_base::in, mais c'est pas très joli !

0 new messages