在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?
您需要检查在使用这些流之前打开文件是否实际成功。此外,它从来没有伤害,以检查是否一切顺利事后。将您的代码更改为此并回报:
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函数吗?
最佳
我试过了sbi的建议(使用std :: ios :: in | std :: ios :: binary而不是std :: ios :: binary),程序仍然无法读取输入文件(返回1) 。即使按照gavinb的建议使用ifstream也没有喜乐。 – 2010-09-29 11:09:40
我刚刚见过Vagaus的建议。复制文件。但我早先已经尝试过(添加#include
经上所记,你src
实例是一个普通的fstream时,你是不是指定为输入一个开放的模式。简单的解决方案是使src
为ifstream
的实例,并且您的代码有效。 (仅添加一个字节!)
如果您已经测试了输入流(如sbi建议),您会发现它没有正确打开,这就是您的目标文件大小为零的原因。它以写入模式打开(因为它是一个ofstream
),截断选项使其为零,但写入rdbuf()
的结果简单失败,没有写入任何内容。
另一件需要注意的是,虽然这对小文件很好,但对于大文件来说效率会很低。现在,您正在将源文件的全部内容读入内存,然后再将其写入一个大块中。这浪费了很多记忆。您最好以大块阅读(比如说1MB,适合磁盘缓存的合理大小)并一次写入一个块,最后一个块是剩余大小。要确定源文件的大小,您可以寻求最后的结果并查询文件偏移量,然后知道正在处理的字节数。
如果你使用本地API,你可能会发现你的操作系统在复制文件时效率更高,但它的可移植性会降低。您可能需要查看Boost文件系统模块以获取便携式解决方案。
我试过了sbi的建议,它显示读取输入文件的错误(retuen 1)。 – 2010-09-29 11:06:05
我试过了sbi的建议(使用std :: ios :: in | std :: ios :: binary而不是std :: ios :: binary),程序仍然无法读取输入文件(返回1)甚至使用ifstream建议gavinb yiels没有喜悦我刚刚见过Vagaus的建议wrt。CopyFile。但我已经尝试过(加入#include
@T J:它打开文件失败或无法读取文件? – sbi 2010-09-29 12:16:47
欢迎来到stackoverflow.com。下一次,pelase使用编辑窗口顶部的'101010'按钮格式化您的代码。另外,您可能想阅读[FAQ](http://stackoverflow.com/faq)。 – sbi 2010-09-29 09:56:46
当你说你确信你在secClassMf19.txt中有数据时,你是否真的在记事本中打开过它并查看了一下? – 2010-09-29 10:03:25