2012-04-10 7 views
1

In meinem Projekt ist es notwendig, in Binärdatei zu lesen und zu schreiben, im Grunde Serialisierung verknüpfter Listen in einer Datei, in der ich den Wert speichern Binärformat und erinnere mich an die TIPP()/Tellg() Offset, wie auch immer, ich kann das nicht tun. Dadurch werden alle darin enthaltenen Inhalte auf Null gelöscht und anstelle des Einfügens wird der aktuelle Inhalt zurückgeschoben.Überschreiben kann nicht an einer bestimmten Stelle in einer Datei. Überschreiben an einer bestimmten Stelle löscht alle Inhalte davor und verschiebt den Wert danach

Zum Beispiel, im folgenden Programm, öffne ich eine Datei, schreibe Werte sagen 1,120,323. Dann schließe es und lies es, es zeigt die exakt richtigen Werte 1.120.323. Aber wenn ich versuche, den Wert von 120-> 220 zu ersetzen, wird 1 zu Null und der Wert wird als 0 220 220 gelesen. Im Grunde schreibt und schiebt 220 über 323 zurück.

#include <iostream> 
#include <fstream> 
#include <cstdlib> 

int main() { 
    std::cout<<"File Ofstream Testing "<<std::endl; 

    const char * file_name = "Test_File.bin"; 
    int ONE = 1; 
    int ZERO = 0; 

    int ONE_TWENTY = 120; 
    int TWO_TWENTY = 220; 

    int THREE_TWENTY_THREE = 323; 
    int THREE_FORTY_FIVE = 345; 

//--------------------------------------------------------------------------- 
{ 
std::ofstream file_write(file_name, std::ios::out|std::ios::binary); 

if(!(file_write.is_open())) { 
    std::cout<<"File cannot be opened "<<std::endl; 
    exit(0); 
} 

file_write.seekp(0); 
file_write.write((char *)&ONE,sizeof(int)); 
file_write.write((char *)&ONE_TWENTY,sizeof(int)); 
file_write.write((char *)&THREE_TWENTY_THREE,sizeof(int)); 

file_write.close(); 
} 
//--------------------------------------------------------------------------- 
{ 
std::ifstream file_read(file_name,std::ios::in|std::ios::binary); 

if(!(file_read.is_open())) { 
     std::cout<<"File cannot be opened "<<std::endl; 
     exit(0); 
} 

int temp; 
file_read.seekg(0); 
file_read.read((char *)&temp,sizeof(int)); 
std::cout<<"Temp "<<temp<<std::endl; 
file_read.read((char *)&temp,sizeof(int)); 
std::cout<<"Temp "<<temp<<std::endl; 
file_read.read((char *)&temp,sizeof(int)); 
std::cout<<"Temp "<<temp<<std::endl; 

file_read.close(); 
} 
    //--------------------------------------------------------------------------- 
{ 
    std::ofstream file_write(file_name, std::ios::out|std::ios::binary); 

    if(!(file_write.is_open())) { 
    std::cout<<"File cannot be opened "<<std::endl; 
    exit(0); 
} 

file_write.seekp(sizeof(int)); 
file_write.write((char *)&TWO_TWENTY,sizeof(int)); 
file_write.seekp(sizeof(int) + sizeof(int)); 
file_write.write((char *)&THREE_FORTY_FIVE,sizeof(int)); 

file_write.close(); 
} 
//-------------------------------------------------------------------------- 
{ 
    std::ifstream file_read(file_name,std::ios::in|std::ios::binary); 

    if(!(file_read.is_open())) { 
    std::cout<<"File cannot be opened "<<std::endl; 
    exit(0); 
} 

    int temp; 
    file_read.seekg(0); 
    file_read.read((char *)&temp,sizeof(int)); 
    std::cout<<"Temp "<<temp<<std::endl; 
    file_read.seekg(sizeof(int)); 
    file_read.read((char *)&temp,sizeof(int)); 
    std::cout<<"Temp "<<temp<<std::endl; 
    file_read.seekg(sizeof(int) + sizeof(int)); 
    file_read.read((char *)&temp,sizeof(int)); 
    std::cout<<"Temp "<<temp<<std::endl; 

    file_read.close(); 
} 
//-------------------------------------------------------------------------------- 
return 0; 
}//fn:main 

Antwort

1

Für Ausgangsströme, die Öffnung mit std::ios::out entspricht std::ios::out | std::ios::trunc, also wenn Sie std::ofstream file_write zum zweiten Mal zu erklären, wird der zuvor geschriebene Inhalt verworfen und Sie die Datei neu zu schreiben. Wenn Sie dann file_write.seekp(sizeof(int)); in einem leeren Stream ausführen, werden 0 Bytes geschrieben. Wenn Sie an eine ofstream anhängen müssten, dann würden Sie es mit std::ios:app öffnen. Das würde die Datei nicht abschneiden, aber Sie könnten sie nur anhängen.

Wenn Sie in einem Dateistream wahlfrei schreiben möchten, müssen Sie es als fstream deklarieren und im Lese- und Schreibmodus öffnen. Also, was Sie brauchen, ist:

std::fstream file_write(file_name, std::ios::in | std::ios::out | std::ios::binary);

+0

Eigentlich habe ich versucht, Datei in fstream zu öffnen, wie Sie erwähnt haben, aber jedes Mal sagt er Datei nicht geöffnet werden kann, wenn ich für file.is_open überprüfen(). Gibt es ein Problem in der Art, wie ich öffne? – howtechstuffworks

+0

std :: fstream-Datei (Dateiname, std :: ios :: in | std :: ios :: out | std :: ios :: binary); if (! File.is_open()) { std :: cout << "Datei kann nicht geöffnet werden, Beenden ...." << std :: endl; Ausgang (0); } – howtechstuffworks

+1

Ich habe es versucht, und es funktioniert. Ich bekomme 1, 220, 345 als Ausgabe. Stellen Sie sicher, dass die vorherigen Streams geschlossen sind, bevor Sie versuchen, dieselbe Datei mit einem anderen Stream zu öffnen. – jrok

Verwandte Themen