2013-02-25 18 views
6

Próbuję otworzyć binarny plik wyjściowy, do którego muszę dołączyć jakieś dane. Nie mogę wyjściowe dane sekwencyjnie, więc muszę być w stanie szukać w strumieniu pliku i nie można użyć flagi std::ios::app.Otwarcie binarnego pliku wyjściowego strumienia bez obcinania

Niestety, podczas otwierania pliku wyjściowego strumienia bez flagi std::ios::app, plik zostanie obcięty, gdy jest on otwarty. Oto przykładowy kod:

#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; 
} 

Oczekuję, że każda egzekucja dopisze do pliku "Hello World". Jednak plik jest obcinany zaraz po jego otwarciu.

Co robię źle? Jeśli jest to błąd w Visual Studio, czy są jakieś obejścia?

Edit: każdym razem, gdy program działa, niezależnie od tego, czy plik istnieje i ma już zawartość, wyjścia programu to:

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

Odpowiedz

6

Musisz otworzyć plik w obu wyjście trybu i wejście :

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

Dzięki, to rzeczywiście działa! Czy jest to błąd w visual studio, czy jest to zamierzone zachowanie ze standardu? Nie znalazłem niczego dokumentujące to ... – zennehoy

+0

@zennehoy Otwieranie pliku w 'trybie out' jest równoważna' fopen (filename, "w") 'oraz' fopen' zadzwonić z 'mode "w"' podano aby skrócić plik. Zobacz np. [Link] (http://en.cppreference.com/w/cpp/io/basic_filebuf/open), aby wyświetlić listę trybów C++ i odpowiadających im 'trybach fopen'. –

Powiązane problemy