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
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
@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'. –