繁体   English   中英

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

[英]Copying contents of one file to another in C++

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

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

在使用这些流之前,您需要检查打开文件是否实际成功。 此外,检查一切事后是否正确,从来没有伤害过。 将您的代码更改为此并报告回:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM