为什么ifstream中的C ++运算符<<会省略某些数据?

时间:2019-12-28 21:34:51

标签: c++ std fstream

在下面的代码中,我收集了一些二进制文件,这些二进制文件是通过下载iso文件的一部分而创建的。单独地,它们只是字节的集合,没有自己的语义。我希望将它们合并到一个文件中,回到原始的iso。由于所有单个文件都只是二进制文件,因此我分别在std::ios_base::binarystd::ifstream中传递了std::ofstream。但是,即使以二进制模式打开,operator<<中的std::ifstream似乎仍在进行一些格式化或语言环境配置。在我的特殊情况下,output.iso缺少3000多个字节,但是如果我使用linux cat来合并它们,则大小正确并形成了一个真实的iso文件。我使用的文件是iso的12个部分,每个部分大约包含160 MiB,因此不适合在此处全部上传。

#include <fstream>
#include <vector>

using namespace std;

int main() {
  vector<ifstream> files; // assume all the streams are created correctly,
                          //  std::ios_base::binary is passed in

  ofstream out{"output.iso", std::ios_base::binary | std::ios_base::trunc |
                                 std::ios_base::ate};
  for (auto const &file : files) {
    out << file.rdbuf();
  }

  // the size of the output.iso is not the size of all the individual files combined
  // when using the linux cat command to merge all files together, it works as
  // expected with the size of the output binary equal to the size of all
  // individual files combined
}

0 个答案:

没有答案