2013-02-25 8 views
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 

答えて

6

あなたは両方の出力入力モードでファイルを開く必要があります:

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

ありがとうございます、それは本当に機能します!これはVisual Studioのバグですか、これは標準からの意図した動作ですか?私はこれを文書化しているものは見つけられませんでした。 – zennehoy

+0

@zennehoy 'out'モードでファイルを開くことは' fopen(filename、 "w") 'と同等で、' 'w" 'モードが指定された' fopen'ファイルを切り捨てます。例えば、 [このリンク](http://en.cppreference.com/w/cpp/io/basic_filebuf/open)を参照して、C++モードとそれに対応する 'fopen'モードのリストを見てください。 –

関連する問題