在不截断的情况下打开二进制输出文件流

Opening a binary output file stream without truncation

本文关键字:二进制 输出 文件 情况下      更新时间:2023-10-16

我正在尝试打开一个二进制输出文件,我需要在其中附加一些数据。我无法按顺序输出数据,因此我需要能够在文件流中进行查找,并且不能使用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

您必须在输出输入模式下打开文件:

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