回答
使用缓冲剂:
#include <fstream>
int main()
{
std::ifstream inFile("In.txt");
std::ofstream outFile("Out.txt");
outFile << inFile.rdbuf();
}
的C++ fstreams在内部缓冲。他们使用有效的缓冲区大小(尽管人们对流的效率的看法:-)。因此,只需将一个流缓冲区复制到一个流中,然后趁着内部魔法将一个流的高效副本转发给另一个流。
但学习做它使用std :: copy()字符char是非常有趣。
非常棒。谢谢。 – user373215 2010-08-18 13:34:10
Iostreams的低效率声誉来自格式化的I/O;对于像这样铲掉原始字节,它和任何东西都是一样的好。 – 2010-08-18 13:54:34
rdbuf()不是rdBuf() – 2010-08-18 21:00:18
只是“缓冲区缓冲区”,以二进制模式复制文件和读/写X字节长部分。我认为最快的解决方案就是使用C语言本身或系统调用的复制功能。
最大的缓冲区将为您提供更少的HDD查找数据操作(更快的复制),但更多的RAM使用率。
如果做得好,逐字节的效率更高。当然,这不是完整的故事:它取决于您一次复制多少个字节。如果从字面上复制byte的字节,则会为每个字节执行一次I/O调用,并最终比字符串库慢。大多数人只是猜测一个好的缓冲区大小(一般为2048或更大,以2为倍数)并使用它。
你能解释一下,在一个好的缓冲区大小下猜测的机制是什么? – user297850 2010-08-18 13:12:07
根据您的文本文件的存储介质类型,您最有可能有512字节扇区(许多传统硬盘驱动器)或2048字节扇区(光盘,许多固态存储设备,一些较新的硬盘驱动器等)。为了最大限度地减少驱动器必须完成的工作,您需要复制扇区的倍数。因此,您可以一次复制2048个字节,并将操作对齐到2048个字节的边界(或者将2048的任何倍数替换为2K)。 – bta 2010-08-18 21:22:10
通常,最好的选择是使用多个内存页面大小。在linux中,我相信默认值是4K。虚拟内存管理器非常擅长为您优化休息,因此一次读取/写入一页可能会非常快。使用更大的缓冲区大小可能会更好,因为所需的系统调用较少(所有系统调用都有开销),也可能是硬盘缓冲(无论如何,无法保证文件将在驱动器的连续扇区中)。这取决于。 – wds 2010-08-23 12:20:49
我实际上不得不一次做同样的事情,所以我用不同的尺寸对它进行了计时。我发现,在一个大文件的情况下,所花费的时间几乎完全取决于我执行了多少I/O(不管它们的大小)。
因此,您最好的选择是尽可能少做I/O。最好两个(一个读取,另一个写入)。
如果逐字或逐行地进行操作,由于有多种换行符(\ r,\ n,\ r \ n)和空格(\ p, \ f,0x32)嵌入在文本文件中,您将冒这样的风险。
复制文件的最有效方法是使用字节缓冲区。只要缓冲区大小不大于硬盘内部缓冲区大小(今天大多为〜8mb),缓冲区越大,复制效率就越高。
尝试使用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";
}
注意:这个可能不适合于所有情况。根据您的特定要求(例如普通或大量文件)使用/裁剪。
- 1. 如何使用c#复制文本框中的文本文件?
- 2. 复制C中的文件
- 3. 如何在C中复制文件#
- 4. 如何在Visual C++中复制文件?
- 5. 从C中的文本文件复制所需的字符串
- 6. 如何在C#中使用itextsharp或pdfsharp复制PDF文件的正文#
- 7. 在Win32 C++中,如何启用静态文本控件来复制文本?
- 8. 从文件将文本复制到阵列中的类C++
- 9. 如何将文本文件的一部分复制到C中的字符串?
- 10. 如何阅读C++中的复杂文本文件?
- 11. C#文件复制退回
- 12. C - 递归复制文件
- 13. 复制文件夹在c
- 14. 复制文件在C#
- 15. C++使用头文件复制文本文件程序
- 16. 从C++中的文本框中复制文本
- 17. C++如何覆盖C++中的文本文件中的数据?
- 18. 在C#中复制文件时检查重复的文件名
- 19. 从c中的文本框转换复制的文本#
- 20. 在文本文件中复制行号c#
- 21. 将文本从C中的文本文件复制到字符数组?
- 22. 如何从二进制文件读取C文本文件?
- 23. 如何将文本复制到C++中的clipborad?
- 24. 如何将内容从文本文件复制到另一个文本文件中C
- 25. Silverlight C# - 如何复制在文本框中单击的文本行?
- 26. 如何从c/C++中的文本文件读取一行?
- 27. 如何从c#中的zip或复合文件解析信息?
- 28. 在C程序中复制文件?
- 29. 用C解析复杂文本文件#
- 30. 如何在C#中重复MIDI文件?
你忘了缓冲区的缓冲区。 C和C++流已经被缓冲(与OS文件系统相关的大小)。用它来复制接近最佳尺寸的块。 – 2010-08-18 13:00:33