|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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__ |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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__ |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
> ofstream fout(path,ios::app);
Pourquoi 'ios::app'? Je n'ajoute pas des octets, mais je les remplace. Merci. |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
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 aussibien, je suppose. -- __Pascal Bourguignon__ |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
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 pouvoircontrô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 |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
> -- 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. |
|
![]() |
| Outils de la discussion | |
|
|