/ / Come posso spostare indietro X byte dalla fine di un file e modificarlo? (Utilizzando ofstream in c ++) - c ++, file, c ++ 11, ofstream

Come posso spostare indietro X byte dalla fine di un file e modificarlo? (Utilizzando ofstream in c ++) - c ++, file, c ++ 11, ofstream

Tutto quello che voglio fare è spostare il puntatore "put" dalla fine del file a un punto "X" di byte alla fine del file.

#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream ofile;
//Assuming "file.dat" does not exist
ofile.open("file.dat", ios::binary|ios::app);
int x = 12;
ofile.write((char*) &x, sizeof(int));
ofile.seekp(-4, ios::cur);
x = 10;
ofile.write((char*) &x, sizeof(int));
ofile.close();

x = 0;
ifstream ifile("file.dat", ios::binary);
ifile.read((char*) &x, sizeof(int));
cout<<x; //This line should display 10
return 0;
}

Tuttavia, l'output visualizza 12 ...

Immagine dell'output qui...

Ho letto molti articoli su StackOverflow, che ha detto che per "cercare" il puntatore "put", devo usare "ios :: ate" e non "ios :: app".

Ma ho anche provato a usare il seguente, e ancora non ho avuto fortuna ...

 ofile.open("file.dat", ios::binary|ios::ate);

È quello che sto facendo male? C'è un altro modo per spostare indietro il puntatore "put" come tale?

Questa è solo la versione più semplice di ciò che non funzionava nel progetto che ho bisogno di fare per la scuola ...

Qualsiasi aiuto sarà apprezzato ... Grazie ...

risposte:

0 per risposta № 1

Quando si specifica ios::app significa "scrivere tutto sempre fino alla fine, non preoccuparti del puntatore".

Se vuoi sempre iniziare a scrivere alla fine, ma vuoi anche essere in grado di muoverti, allora hai bisogno ios::ate, ma se usi solo ios::binary|ios::ate quindi il file verrà troncato. Devi aggiungere ios::in e funzionerà.

Funzionerà quando il file esiste e scriverà fino alla fine, sovrascriverlo e leggerlo.

#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream ofile;
//Assuming "file.dat" does not exist
ofile.open("file.dat", ios::binary|ios::in|ios::ate);
int x = 12;
ofile.write((char*) &x, sizeof(int));
ofile.seekp(-4, ios::cur);
x = 10;
ofile.write((char*) &x, sizeof(int));
ofile.close();

x = 0;
ifstream ifile("file.dat", ios::binary|ios::ate);
ifile.read((char*) &x, sizeof(int));
ifile.seekp(-4, ios::cur);
cout<<x; //This line should display 10
return 0;
}