2013-02-25 96 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

谢谢,这确实有效!这是视觉工作室中的一个错误,还是标准中的这种预期行为?我还没有发现任何文件记录...... – zennehoy 2013-02-25 10:15:42

+0

@zennehoy以'out'模式打开文件等同于'fopen(filename,“w”)',并且''w''模式下的fopen调用被指定截断文件。见例如[此链接](http://en.cppreference.com/w/cpp/io/basic_filebuf/open)查看C++模式及其相应的“fopen”模式列表。 – 2013-02-25 10:22:25