我正在使用以下程序尝试将文件src的内容复制到另一个目标,在C ++中。简化代码如下:
#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中使用带有GCC编译器的CODEBLOCKS ide构建并执行程序时,创建了一个名为“.... mf19.txt”的新文件,但没有数据被复制到其中,并且filesize = 0kb。我很肯定我在“... secClassMf19.txt”中有一些数据。
当我在Windows Visual C ++ 2008中编译相同的progeam时,我遇到了同样的问题。
任何人都可以帮助解释为什么我会遇到这种意外行为,更重要的是,如何解决这个问题?
答案 0 :(得分:4)
在使用这些流之前,您需要检查打开文件是否实际成功。此外,检查一切事后是否正确,从来没有伤害过。将您的代码更改为此并报告回来:
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
打开它。
答案 1 :(得分:1)
您有任何理由不使用CopyFile功能吗?
最佳
答案 2 :(得分:1)
在编写时,您的src
实例是常规fstream,并且您没有指定打开模式进行输入。简单的解决方案是使src
成为ifstream
的实例,并且您的代码可以运行。 (只需添加一个字节!)
如果您测试了输入流(如sbi建议的那样),您会发现它没有正确打开,这就是您的目标文件大小为零的原因。它在写入模式下打开(因为它是一个ofstream
),截断选项使其为零,但是写rdbuf()
的结果只是失败了,没有写任何内容。
另外需要注意的是,虽然这对小文件很有效,但对于大文件来说效率非常低。您正在将源文件的全部内容读入内存,然后在一个大块中再次写出来。这浪费了很多记忆。你最好以块的形式读取(例如1MB,磁盘缓存的合理大小)并一次写一个块,最后一个是大小的剩余部分。要确定源的大小,可以搜索到最后并查询文件偏移量,然后知道要处理的字节数。
如果您使用本机API,您可能会发现您的操作系统在复制文件时效率更高,但随后它变得不那么便携。您可能需要查看Boost文件系统模块以获取可移植解决方案。