8

データを追加する必要があるバイナリ出力ファイルを開こうとしています。データを連続して出力できないため、ファイル ストリーム内でシークできるようにする必要があり、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
4

1 に答える 1

9

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

std::fstream file("output.bin", std::ios::in | std::ios::out | std::ios::binary | std::ios::ate);
于 2013-02-25T10:08:50.430 に答える