如何在C++中用一个二进制文件追加另一个二进制文件

3

我有两个二进制文件,想要将它们合并起来。如何操作呢?

std::ofstream outFile;
outFile.open( "file.bin", ? );

下一行应该是什么?


从文件2中读取所有内容并将其写入文件1。 - deviantfan
也许你应该先读取一个文件,然后定位到结尾再写入另一个文件。为什么不展示一下你真的尝试过呢? - harper
打开文件(以二进制模式),将指针定位到第一个(目标)文件的末尾,在从第二个(源)文件读取数据时同时写入第一个文件。是的,有一些打开模式标志可以帮助您完成这个任务。 - Some programmer dude
我想知道是否有更短的方法来追加它。 - user1016179
2个回答

3
这个可以用一行代码搞定:
std::ofstream outFile("file.out", std::ios::ate );
std::ifstream inFile( "file.in" );

std::copy( 
    (std::istreambuf_iterator<char>(inFile)),  // (*)
     std::istreambuf_iterator<char>(),
     std::ostreambuf_iterator<char>(outFile)
);

(*) 多加一对括号以防止将其解析为函数声明。

为了更好的性能,您可以使用ifstream::read按块读取文件,并使用ofstream::write写入它们。


不错。小提醒一下:outFile难道不应该使用ios::app打开吗? - Martin J.
@MartinJ。谢谢,错了。ateapp,这并不重要,因为我们在写入之间不会寻找。 - jrok
@JoachimPileborg 我一直以为使用streambuf迭代器时不需要,我会再确认一下。 - jrok
@JoachimPileborg 看起来没问题。 - jrok
2
或者你可以直接使用 outFile << inFile.rdbuf() - David G
@0x499602D2 我总是忘记那个! - jrok

0

这不是最优解,但你可以尝试类似的方法:

std::ofstream outFile( "file.bin", ios_base::app | ios_base::out );

std::ifstream inFile(source_file_name, ios_base::binary | ios_base::in);
source >> noskipws;
char c;
while (inFile >> c) {
    outFile << c;
}

你可以使用更大的缓存区来提高效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接