关于c ++中fstream的几个问题

时间:2014-05-03 14:36:41

标签: c++ stream

首先,我对使用大文件的最佳方式感兴趣,这个代码是否在底层推荐?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    ifstream file("first.exe", ios::binary | ios::app);
    file.seekg(0, ios::end);
    int size = file.tellg();
    file.seekg(0, ios::beg);
    char content[size];
    file.read(content, size);
    ofstream file2("second.exe", ios::binary);
    file2.write(content, size);
    file2.close();
}

另外,为什么在这种情况下需要使用二进制模式?

1 个答案:

答案 0 :(得分:2)

这是推荐的方式吗?并不是的。见下文。

二进制模式?

打开文件有两种方法:文本模式和二进制模式。默认为文本模式,除非您在打开文件时使用std::ios::binary

在Linux / Unix上,二进制模式和文本模式是相同的。没有区别。

在Windows上,当在文本模式下打开文件时,o / s会进行一些转换。当您编写\n(ASCII 10)时,它会转换为\r\n对(ASCII 10和13)。当您阅读\r\n对时,它会转换为单个\n。此外,Ctl-Z(ASCII 26)被视为文件结尾,因此读取将终止。

原因是历史性的,我现在不再详述。如果您读取和写入纯ASCII文本,这不会导致任何问题,甚至可能是理想的。如果您正在处理其他任何事情(例如exe文件),那么您使用二进制模式必需

下面的代码演示了一种简单的文件i / o技术,它试图捕获C ++编程的本质。我希望它是合理的不言自明的。 std::copy()std::istreambuf_iteratorstd::ostreambuf_iterator的查询参考,并在需要时提出问题。

#include <iostream>
#include <fstream>
#include <algorithm>

int main() 
{
    std::ifstream fsIn("first.exe", std::ios::binary);
    std::ofstream fsOut("second.exe", std::ios::binary|std::ios::trunc);

    std::copy(std::istreambuf_iterator<char>(fsIn), 
              std::istreambuf_iterator<char>(), 
              std::ostreambuf_iterator<char>(fsOut));
    return 0;
}