我正在使用下面的程序来尝试在C ++中将文件src的内容复制到另一个dest。 简化代码如下:
#include <fstream> using namespace std; int main() { fstream src("c:\\tplat\test\\secClassMf19.txt", fstream::binary); ofstream dest("c:\\tplat\\test\\mf19b.txt", fstream::trunc|fstream::binary); dest << src.rdbuf(); return 0; }
当我在Windows中使用CODEBLOCKS ide和GCC Compiler构build并执行程序时,创build了一个名为“…. mf19.txt”的新文件,但没有将数据复制到它,而filesize = 0kb。 我是积极的,我有一些数据在“… secClassMf19.txt”。
当我在Windows Visual C ++ 2008中编译相同的progeam时遇到同样的问题。
任何人都可以请帮忙解释为什么我得到这个意外的行为,更重要的是,如何解决这个问题?
在使用这些流之前,您需要检查打开文件是否成功。 此外,它从来没有伤害检查是否一切顺利事后。 改变你的代码,并报告:
int main() { std::fstream src("c:\\tplat\test\\secClassMf19.txt", std::ios::binary); if(!src.good()) { std::cerr << "error opening input file\n"; std::exit(1); } std::ofstream dest("c:\\tplat\\test\\mf19b.txt", std::ios::trunc|std::ios::binary); if(!dest.good()) { std::cerr << "error opening output file\n"; std::exit(2); } dest << src.rdbuf(); if(!src.eof()) std::cerr << "reading from file failed\n"; if(!dst.good()) std::cerr << "writing to file failed\n"; return 0; }
我敢打赌,你会报告前两个检查点之一。
如果打开输入文件失败,尝试打开它使用std::ios::in|std::ios::binary
而不是只是std::ios::binary
。
你有什么理由不使用CopyFile功能?
最好
正如所写的,你的src
实例是一个普通的fstream,并且你没有指定一个开放的输入模式。 简单的解决方案是让src
成为ifstream
一个实例,并且你的代码工作。 (只需要添加一个字节!)
如果你测试了输入流(如sbi建议),你会发现它没有正确打开,这就是为什么你的目标文件是零大小。 它以写入模式打开(因为它是一个ofstream
)与截断选项,使其为零,但写入rdbuf()
的结果只是失败,没有写入。
另外要注意的是,虽然这对小文件很好,但对于大文件来说效率会很低。 现在,您正在将源文件的全部内容读入内存,然后再将其写入一个大块中。 这浪费了很多的记忆。 你最好是分块读取数据(比如说1MB,一个合理的磁盘缓存大小),一次写入一个数据块,最后一个数据块是剩下的大小。 要确定源的大小,您可以查找到最后并查询文件偏移量,然后知道您正在处理多少个字节。
如果使用本地API,则可能会发现操作系统在复制文件方面效率更高,但是便携性不高。 您可能需要查看Boost文件系统模块以获取便携式解决方案。