Domanda

Ho dei problemi con la sostituzione di una parte di un file in modalità binaria. Per qualche ragione la mia linea seekp () non sta posizionando il puntatore del file nella posizione desiderata. In questo momento sta aggiungendo i nuovi contenuti alla fine del file invece di sostituire la porzione desiderata.

long int pos;
bool found = false;
fstream file(fileName, ios::binary|ios::out|ios::in);

file.read(reinterpret_cast<char *>(&record), sizeof(Person));

while (!file.eof())
{   
    if (record.getNumber() == number) {
       pos=file.tellg();
       found = true;
       break;
}

// the record object is updated here

file.seekp(pos, ios::beg); //this is not placing the file pointer at the desired place
file.write(reinterpret_cast<const char *>(&record), sizeof(Person));
cout << "Record updated." << endl;
file.close();

Sto facendo qualcosa di sbagliato?

Grazie mille in anticipo.

È stato utile?

Soluzione

Non vedo come il tuo ciclo while () possa funzionare. In generale, non dovresti testare eof () ma testare se un'operazione di lettura ha funzionato.

Il codice seguente scrive un record in un file (che deve esistere) e quindi lo sovrascrive:

#include <iostream>
#include <fstream>
using namespace std; 

struct P {
    int n;
};

int main() {
  fstream file( "afile.dat" , ios::binary|ios::out|ios::in);
  P p;
  p.n = 1;
  file.write( (char*)&p, sizeof(p) );
  p.n = 2;
  int pos = 0;
  file.seekp(pos, ios::beg);
  file.write( (char*)&p, sizeof(p) );
}   

Altri suggerimenti

while (!file.eof())
{   
    if (record.getNumber() == number) {
       pos=file.tellg();
       found = true;
       break;
}

qui - non stai aggiornando il numero né il record - quindi sostanzialmente vai in tutti i file e scrivi in ??" alcuni " posizione (pos non inited)

E Neil Butterworth ha ragione (pubblicato mentre ho digitato 8)) sembra che tu abbia omesso smth

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top