我需要一种跨平台、无需外部库的复制文件的方式。在我的第一遍中,我想出了(省略错误处理):
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 上使用运算符
此外,更改上面代码中缓冲区的大小不会影响对硬盘驱动器的读写大小。为此,您需要使用stream.rdbuf()->pubsetbuf()设置缓冲区。
我想知道你的 fstream 默认情况下是否是无缓冲的。 GCC 4.5.2 默认情况下使用内部缓冲区,但我认为标准并不要求这样做。您是否尝试过使用 pubsetbuf (见下文)为您的输入/输出流设置缓冲区。
对我的系统进行快速测试,如果我将 LEN 设置为 0(因此无缓冲),则复制 1 MB 文件需要 10 秒。使用 4k 缓冲区,不到一秒即可完成。
#include <iostream>
#include <fstream>
int main() {
using namespace std;
const char* srcFile = "test.in";
const char* destFile = "test.out";
ifstream src;
ofstream dest;
const int LEN=8192;
char buffer_out[LEN];
char buffer_in[LEN];
if (LEN) {
src.rdbuf()->pubsetbuf(buffer_in, LEN );
dest.rdbuf()->pubsetbuf(buffer_out, LEN);
} else {
src.rdbuf()->pubsetbuf(NULL, 0 );
dest.rdbuf()->pubsetbuf(NULL, 0);
}
src.open(srcFile, ios::in | ios::binary);
dest.open(destFile, ios::out | ios::binary);
dest << src.rdbuf();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)