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 ...
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 № 1Quando 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;
}