2013-02-25 14 views
6

Ich versuche, eine binäre Ausgabedatei zu öffnen, an die ich einige Daten anhängen muss. Ich kann die Daten nicht sequentiell ausgeben, daher muss ich in der Lage sein, innerhalb des Dateistroms zu suchen, und kann das Flag std::ios::app nicht verwenden.Öffnen eines binären Ausgabedatei-Streams ohne Trunkierung

Leider wird beim Öffnen eines Ausgabedatei-Streams ohne das Flag die Datei abgeschnitten, wenn sie geöffnet wird. Hier ist ein Beispielcode:

#include <iostream> 
#include <fstream> 

int main() { 
    std::ofstream file("output.bin", std::ios::binary | std::ios::ate); 

    std::streamoff orig_offset = file.tellp(); 
    std::cout << "Offset after opening: " << orig_offset << std::endl; 

    file.seekp(0, std::ios::end); 
    std::streamoff end_offset = file.tellp(); 
    std::cout << "Offset at end: " << end_offset << std::endl; 

    file << "Hello World" << std::endl; 

    std::streamoff final_offset = file.tellp(); 
    std::cout << "Offset after writing: " << final_offset << std::endl; 

    return 0; 
} 

Ich würde erwarten, dass jede Ausführung "Hallo Welt" an die Datei anhängen. Die Datei wird jedoch abgeschnitten, sobald sie geöffnet wird.

Was mache ich falsch? Wenn das ein Fehler in Visual Studio ist, gibt es Problemumgehungen?

Edit: Jedes Mal, das Programm läuft, unabhängig davon, ob die Datei vorhanden ist oder bereits Inhalt, das Programm gibt diese:

Offset after opening: 0 
Offset at end: 0 
Offset after writing: 12 

Antwort

6

Sie haben die Datei in beiden Ausgängen öffnen und Eingabemodus :

std::fstream file("output.bin", std::ios::in | std::ios::out | std::ios::binary | std::ios::ate); 
+0

Danke, das funktioniert tatsächlich! Ist das ein Bug im Visual Studio, oder ist das beabsichtigte Verhalten vom Standard? Ich habe nichts gefunden, was dies dokumentiert ... – zennehoy

+0

@zennehoy Das Öffnen einer Datei im 'out' Modus entspricht' fopen (Dateiname, "w") ', und' fopen' Aufruf mit '" w "' Modus ist spezifiziert um die Datei zu kürzen. Siehe z.B. [this link] (http://en.cppreference.com/w/cpp/io/basic_filebuf/open) um eine Liste der C++ - Modi und ihrer entsprechenden 'fopen'-Modi zu sehen. –

Verwandte Themen