[...]
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.
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/
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.
| > >
| > > [...]
| > > 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
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 ?
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 !