首先,我对使用大文件的最佳方式感兴趣,这个代码是否在底层推荐?
#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();
}
另外,为什么在这种情况下需要使用二进制模式?
答案 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_iterator和std::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;
}