尝试将文本文件A复制到另一个文件B时,可能有几种方法:
1)逐字节
2)逐词
3)逐行
哪一种更有效?
哪一种更有效?
使用缓冲区:
#include <fstream>
int main()
{
std::ifstream inFile("In.txt");
std::ofstream outFile("Out.txt");
outFile << inFile.rdbuf();
}
C++的fstream内部是有缓冲区的。它们使用高效的缓冲区大小(尽管人们对流的效率有所抱怨):-)。所以只需将一个流缓冲区复制到另一个流,内部的魔法就会高效地完成从一个流到另一个流的复制。
但是逐个字符地学习使用std::copy()更有趣。
只需“逐个缓冲区”地以二进制模式复制文件并读/写X字节长的部分。我认为最快的解决方案是直接使用C语言本身或系统调用的复制功能。
最大的缓冲区将为您提供更少的HDD查找数据操作(更快的复制),但会增加更多的RAM使用。
尝试使用C++的iostreams和STL。以下是一个例子:
ifstream infile("to_copy.txt");
if (infile)
{
istreambuf_iterator<char> ifit(infile);
ofstream outfile("the_copy.txt");
ostreambuf_iterator<char> ofit(outfile);
if (outfile)
{
copy(ifit, istreambuf_iterator<char>(), ofit);
outfile.close();
}
else
{
cerr << "Could not open output file" << "\n";
}
infile.close();
}
else
{
cerr << "Could not open input file" << "\n";
}
注意:这可能不适用于所有情况。根据您的具体要求使用/定制此内容(例如普通或巨大文件)。
如果你逐字逐句地复制,由于文本文件中嵌入了许多行分隔符(\r、\n、\r\n)和空格(\p、\f、0x32),你几乎无法重建原始文件,有失误的风险。
复制文件最有效的方法是使用字节缓冲区。缓冲区越大,复制就越有效率,只要你的缓冲区大小不超过硬盘内部缓冲区大小(今天大约为8mb)。
实际上,我曾经自己做过同样的事情,所以我用不同的大小计时了一下。我发现,对于一个大文件,所花费的时间几乎完全取决于我执行了多少次I/O操作(无论它们的大小如何)。
因此,你最好尽可能少地进行I/O操作。最好只进行两次(一次读取,一次写入)。