用C ++将一个文件的内容复制到另一个文件

时间:2010-09-29 09:54:06

标签: c++ windows file copy

我正在使用以下程序尝试将文件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时,我遇到了同样的问题。

任何人都可以帮助解释为什么我会遇到这种意外行为,更重要的是,如何解决这个问题?

3 个答案:

答案 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文件系统模块以获取可移植解决方案。