【发布时间】:2011-08-30 22:56:14
【问题描述】:
我需要一种跨平台、无外部库的复制文件的方式。在我的第一遍中,我想出了(省略了错误处理):
char buffer[LEN];
ifstream src(srcFile, ios::in | ios::binary);
ofstream dest(destFile, ios::out | ios::binary);
while (!src.eof()) {
src.read(buffer, LEN);
dest.write(buffer, src.gcount());
}
这很好我知道它在做什么。
然后我在 stackoverflow 上找到了一个帖子(抱歉,现在找不到链接)说我可以将上面的所有代码替换为:
dest << src.rdbuf();
它既漂亮又紧凑,但隐藏了很多关于它在做什么。结果也很慢因为ofstream::operator
有没有办法让这个方法更快?我原来的方法有缺点吗?
更新:在 Windows 上使用 operator 执行得更好
此外,在上面的代码中更改缓冲区的大小不会影响对硬盘驱动器的读写大小。为此,您需要使用 stream.rdbuf()->pubsetbuf() 设置缓冲区。
【问题讨论】:
-
你为什么不
define每个平台的副本?还是使用提升? -
dest.write(src.rdbuf(), size);怎么样? -
“我需要一个跨平台,没有外部库,方式”我不确定在什么情况下需要同时成为跨平台和被禁止从使用库。尤其是因为库是跨平台开发最有效的工具。
-
如果你使用普通的 c 调用,你会看到更好的性能。流在性能方面被削弱了。如果性能很重要,请不要使用它们
-
@Pavel:这些流旨在轻松处理大文件。我相信对于小文件,它们只比 C 稍慢。