PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.c++ > Ecriture en fin de fichier
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Ecriture en fin de fichier

Réponse
 
LinkBack Outils de la discussion
Vieux 07/04/2008, 13h08   #1
Guillaume GOURDIN
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Ecriture en fin de fichier

Bonjour à tous,

j'ai besoin de remplacer un certain nombre d'octets à la fin d'un
fichier. Comment procéderiez-vous? Faut-il utiliser un ofstream? Un
ifstream?

Merci pour votre aide.
  Réponse avec citation
Vieux 07/04/2008, 13h23   #2
Pascal J. Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

Guillaume GOURDIN <trash@hotmail.com> writes:

> Bonjour à tous,
>
> j'ai besoin de remplacer un certain nombre d'octets à la fin d'un
> fichier. Comment procéderiez-vous? Faut-il utiliser un ofstream? Un
> ifstream?
>
> Merci pour votre aide.


J'essayerai comme ça:

ofstream fout(path,ios::app);
fout.seekp(certain_nombre,ios::end);
fout.put(octet);
fout.close();

--
__Pascal Bourguignon__
  Réponse avec citation
Vieux 07/04/2008, 13h43   #3
Michael DOUBEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

Pascal J. Bourguignon a écrit :
> Guillaume GOURDIN <trash@hotmail.com> writes:
>
>> Bonjour à tous,
>>
>> j'ai besoin de remplacer un certain nombre d'octets à la fin d'un
>> fichier. Comment procéderiez-vous? Faut-il utiliser un ofstream? Un
>> ifstream?
>>
>> Merci pour votre aide.

>
> J'essayerai comme ça:
>
> ofstream fout(path,ios::app);
> fout.seekp(certain_nombre,ios::end);
> fout.put(octet);
> fout.close();


A noter, qu'il n'y a pas de moyen de tronquer un fichier en C++ .Donc il
faut ré-écrire tous les octets à remplacer.

Michael
  Réponse avec citation
Vieux 07/04/2008, 13h52   #4
Pascal J. Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

Michael DOUBEZ <michael.doubez@free.fr> writes:

> Pascal J. Bourguignon a écrit :
>> Guillaume GOURDIN <trash@hotmail.com> writes:
>>
>>> Bonjour à tous,
>>>
>>> j'ai besoin de remplacer un certain nombre d'octets à la fin d'un
>>> fichier. Comment procéderiez-vous? Faut-il utiliser un ofstream? Un
>>> ifstream?
>>>
>>> Merci pour votre aide.

>> J'essayerai comme ça:
>> ofstream fout(path,ios::app);
>> fout.seekp(certain_nombre,ios::end);
>> fout.put(octet);
>> fout.close();

>
> A noter, qu'il n'y a pas de moyen de tronquer un fichier en C++ .Donc
> il faut ré-écrire tous les octets à remplacer.


On peut toujours appeler ::truncate, sur un système POSIX avec extension XSI.

--
__Pascal Bourguignon__
  Réponse avec citation
Vieux 07/04/2008, 16h47   #5
Guillaume GOURDIN
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

> ofstream fout(path,ios::app);

Pourquoi 'ios::app'? Je n'ajoute pas des octets, mais je les remplace.

Merci.
  Réponse avec citation
Vieux 07/04/2008, 16h54   #6
Pascal J. Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

Guillaume GOURDIN <trash@hotmail.com> writes:

>> ofstream fout(path,ios::app);

>
> Pourquoi 'ios::app'? Je n'ajoute pas des octets, mais je les remplace.


Pour se positionner dès l'ouverture en fin de fichier, en supposant
qu'un certain nombre est assez petit.. Mais un ios:ut irait aussi
bien, je suppose.

--
__Pascal Bourguignon__
  Réponse avec citation
Vieux 08/04/2008, 08h56   #7
James Kanze
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

On Apr 7, 2:08 pm, Guillaume GOURDIN <tr...@hotmail.com> wrote:

> j'ai besoin de remplacer un certain nombre d'octets à la fin
> d'un fichier. Comment procéderiez-vous? Faut-il utiliser un
> ofstream? Un ifstream?


La plupart du temps, dans de tels cas, j'utilise carrément
l'interface Posix, avec des ostringstream pour formatter. Mais
je n'ai pas besoin de portabilité (du moment que le code marche
et sous Solaris et sous Linux), et j'ai besoins des écritures
synchronisées. On peut bien le faire avec un fstream, en prenant
des précautions nécessaires.

Plusieurs points importants :

-- L'ouverture en écriture seulement vide toujours le fichier,
s'il existe déjà. Il faut absolument ouvrir en
bidirectionnel, si tu veux y écrire, mais tu ne veux pas
détruire tout le contenu précédant.

-- Si tu veux utiliser seek pour aller à un endroit arbitraire,
il faut ouvrir en mode binaire ; sinon, tu n'as droit à
seeker qu'au deux bouts ou à un endroit où tu as fait un
tell.

-- Enfin, tu ne peux changer la taille du fichier qu'en
ajoutant des octets à la fin. Si tu veux remplacer un
enrégistrement dans le fichier, il faut que la taille du
remplacement soit identique à la taille de ce que tu
remplaces.

Donc, en supposant que tu saches déjà exactement où tu veux
écrire, le code devient quelque chose comme :

std:fstream dest(
name, std::ios::in | std::ios:ut | std::ios::binary ) ;
dest.seekp( position, std::ios::beg ) ;
// Sorties vers dest, en prenant bien soin du nombre
// des octets générés.

Note que ce dernier point argue fort en faveur de l'utilisation
d'un std:stringstream pour le formattage, afin de pouvoir
contrôle très exactement le nombre d'octets écrits (avec par
exemple dest.write, plutôt que des opérateurs <<).

--
James Kanze (GABI Software) email:james.kanze@gmail.com
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
  Réponse avec citation
Vieux 08/04/2008, 10h22   #8
Guillaume GOURDIN
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Ecriture en fin de fichier

> -- L'ouverture en écriture seulement vide toujours le fichier,
> s'il existe déjà. Il faut absolument ouvrir en
> bidirectionnel, si tu veux y écrire, mais tu ne veux pas
> détruire tout le contenu précédant.


Effectivement, c'set que j'ai fait en premier et je ne comprenais pas
pourquoi mon fichier était systématiquement vidé.

> -- Si tu veux utiliser seek pour aller à un endroit arbitraire,
> il faut ouvrir en mode binaire ; sinon, tu n'as droit à
> seeker qu'au deux bouts ou à un endroit où tu as fait un
> tell.


Ah bon? En fait, ce que j'ai fait, c'est utilisé un fstream, que j'ouvre
avec les flags par défaut (in et out, et il me semble que le mode
binaire n'est pas activé) et j'arrive à faire des seek. Le code exact
ressemble à ça :

fstream file;
file.open( filename );
file.seekp( -count-4, ios_base::end );

file.put( 1 );
file.put( 2 );
file.put( 3 );
...

> Donc, en supposant que tu saches déjà exactement où tu veux
> écrire, le code devient quelque chose comme :
>
> std:fstream dest(
> name, std::ios::in | std::ios:ut | std::ios::binary ) ;
> dest.seekp( position, std::ios::beg ) ;
> // Sorties vers dest, en prenant bien soin du nombre
> // des octets générés.


Ici quelle est la signification précise de 'std::ios::in'? Que l'on va
faire des seek? Qu'il ne fait pas effacer le contenu du fichier?

Merci beaucoup.
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 06h44.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,14317 seconds with 16 queries