6
データを追加するバイナリ出力ファイルを開こうとしています。データを順次出力することはできないので、ファイルストリーム内でシークできる必要があり、std::ios::app
フラグを使用することはできません。切り捨てなしでバイナリ出力ファイルストリームを開く
残念ながら、std::ios::app
フラグを付けずに出力ファイルストリームを開くと、ファイルは開かれたときに切り捨てられます。ここにいくつかのサンプルコードがあります:
#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;
}
私はすべての実行がファイルに "Hello World"を追加すると思います。ただし、ファイルを開くとすぐに切り捨てられます。
私は間違っていますか?これがVisual Studioのバグならば、回避策はありますか?
編集: プログラムは関係なく、ファイルが存在するかどうかの、走るか、既に内容、プログラムの出力を持つたびに、この:
Offset after opening: 0
Offset at end: 0
Offset after writing: 12
ありがとうございます、それは本当に機能します!これはVisual Studioのバグですか、これは標準からの意図した動作ですか?私はこれを文書化しているものは見つけられませんでした。 – zennehoy
@zennehoy 'out'モードでファイルを開くことは' fopen(filename、 "w") 'と同等で、' 'w" 'モードが指定された' fopen'ファイルを切り捨てます。例えば、 [このリンク](http://en.cppreference.com/w/cpp/io/basic_filebuf/open)を参照して、C++モードとそれに対応する 'fopen'モードのリストを見てください。 –