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

C++ 在不截断的情况下打开二进制输出文件流,c++,visual-c++,C++,Visual C++,我试图打开一个二进制输出文件,需要向其中添加一些数据。我无法按顺序输出数据,因此我需要能够在文件流中查找,并且不能使用std::ios::app标志 不幸的是,当在没有std::ios::app标志的情况下打开输出文件流时,文件在打开时会被截断。下面是一些示例代码: #include <iostream> #include <fstream> int main() { std::ofstream file("output.bin", std::ios::bina

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

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

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

谢谢,这确实有效!这是VisualStudio中的错误,还是标准中的预期行为?我还没有找到任何记录这一点的东西…@zennehoy在
out
模式下打开一个文件相当于
fopen(文件名,“w”)
,并且
fopen
调用
“w”
模式被指定为截断文件。例如,查看C++模式及其对应的<代码> fOpen< /COD>模式的列表。
std::fstream file("output.bin", std::ios::in | std::ios::out | std::ios::binary | std::ios::ate);