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

问题描述:

我正在使用以下程序尝试在C++中将文件src的内容复制到另一个dest。下面的代码简化给出:在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中使用的代码块IDE与GCC编译创建程序,一个名为新文件“mf19.txt ......”,但没有数据复制到它,并filesize = 0kb。我很积极,我在“... secClassMf19.txt”中有一些数据。

我遇到同样的问题,当我在Windows的Visual C++ 2008

任何人都可以请帮忙解释一下为什么我收到这个意外的行为,更重要的是,如何解决这个问题编译相同progeam?

+0

欢迎来到stackoverflow.com。下一次,pelase使用编辑窗口顶部的'101010'按钮格式化您的代码。另外,您可能想阅读[FAQ](http://stackoverflow.com/faq)。 – sbi 2010-09-29 09:56:46

+0

当你说你确信你在secClassMf19.txt中有数据时,你是否真的在记事本中打开过它并查看了一下? – 2010-09-29 10:03:25

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

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函数吗?

最佳

+0

我试过了sbi的建议(使用std :: ios :: in | std :: ios :: binary而不是std :: ios :: binary),程序仍然无法读取输入文件(返回1) 。即使按照gavinb的建议使用ifstream也没有喜乐。 – 2010-09-29 11:09:40

+0

我刚刚见过Vagaus的建议。复制文件。但我早先已经尝试过(添加#include 。那么我使用的代码是:CopyFile((LPCWSTR)“c:\\ tplat \ test \\ secClassMf19.txt”,(LPCWSTR)“c:\\ tplat \\ test \\ mf19b.txt“,true);但它也没有工作,也许我做错了什么。 – 2010-09-29 11:14:00

经上所记,你src实例是一个普通的fstream时,你是不是指定为输入一个开放的模式。简单的解决方案是使srcifstream的实例,并且您的代码有效。 (仅添加一个字节!)

如果您已经测试了输入流(如sbi建议),您会发现它没有正确打开,这就是您的目标文件大小为零的原因。它以写入模式打开(因为它是一个ofstream),截断选项使其为零,但写入rdbuf()的结果简单失败,没有写入任何内容。

另一件需要注意的是,虽然这对小文件很好,但对于大文件来说效率会很低。现在,您正在将源文件的全部内容读入内存,然后再将其写入一个大块中。这浪费了很多记忆。您最好以大块阅读(比如说1MB,适合磁盘缓存的合理大小)并一次写入一个块,最后一个块是剩余大小。要确定源文件的大小,您可以寻求最后的结果并查询文件偏移量,然后知道正在处理的字节数。

如果你使用本地API,你可能会发现你的操作系统在复制文件时效率更高,但它的可移植性会降低。您可能需要查看Boost文件系统模块以获取便携式解决方案。

+0

我试过了sbi的建议,它显示读取输入文件的错误(retuen 1)。 – 2010-09-29 11:06:05

+0

我试过了sbi的建议(使用std :: ios :: in | std :: ios :: binary而不是std :: ios :: binary),程序仍然无法读取输入文件(返回1)甚至使用ifstream建议gavinb yiels没有喜悦我刚刚见过Vagaus的建议wrt。CopyFile。但我已经尝试过(加入#include 。我使用的代码是:CopyFile((LPCWSTR)“c:\ \ tplat \ test \\ secClassMf19.txt“,(LPCWSTR)”c:\\ tplat \\ test \\ mf19b.txt“,true);但它也不起作用,并且该文件在NOTEPAD中打开,大小仅为1KB。 – 2010-09-29 11:54:30

+0

@T J:它打开文件失败或无法读取文件? – sbi 2010-09-29 12:16:47