【问题标题】:Opening a binary output file stream without truncation打开没有截断的二进制输出文件流
【发布时间】:2013-02-25 09:40:23
【问题描述】:

我正在尝试打开一个二进制输出文件,我需要在其中添加一些数据。我不能顺序输出数据,所以我需要能够在文件流中查找,不能使用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

【问题讨论】:

    标签: c++ visual-c++


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,确实有效!这是视觉工作室中的错误,还是标准的预期行为?我还没有找到任何记录...
    • @zennehoy 在out 模式下打开文件等效于fopen(filename, "w"),并指定fopen 调用"w" 模式来截断文件。参见例如this link 查看 C++ 模式列表及其对应的fopen 模式。
    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多