如何在不使用boost库的情况下在C ++程序中读取多个二进制文件

时间:2015-11-11 14:33:39

标签: c++ file boost

我有可变数量的二进制文件(超过100)。每个文件都很大,但浮点数完全相同(例如,1E8)。某些函数/操作将应用于文件中具有相同下标的浮点数,例如,每个文件中的第10个数字。

由于文件的总大小很大,因此首先将所有文件读入内存然后进行操作是低效的。相反,我想以在线方式做到这一点。

vector<string> file (nfiles, file_prefix);
vector<shared_ptr<ifstream> > in;
for(int g = 0; g < nfile; ++g){
  ostringstream fid;
  fid << file_id[g];
  file[g] = file[g] + fid.str() + string(".bin");

  in.push_back(make_shared<ifstream> (file[g].c_str())); //how to specify ios::binary??
}

vector<float> s(nfiles);
for(int i = 0; i < nlines; ++i){
  for(int g = 0; g < nfiles; ++g){
    in[g].read((char*) s[g], sizeof(float));
  }
  // do something with s
}

上面的代码不起作用,因为在为每个文件创建流时,我不知道如何指定ios :: binary。它用于显示我想要的东西。此外,它依赖于不允许在我的项目中使用的boost库。我想学习一种不使用boost的解决方案。

编辑:根据此主题中的评论,我了解到即使我使用make_shared,实际上也不需要提升。我仍然不明白为什么我在行no matching function for call to 'make_shared'

中收到错误in.push_back(...)

编辑:编译错误是由于我的代码中出现了拼写错误。所以我在这个帖子中的所有问题都得到解决。

2 个答案:

答案 0 :(得分:2)

std::make_shared<T>将其参数转发给适当的构造函数。

  gin.push_back(std::make_shared<ifstream> (gene_out[g].c_str(), std::ios::binary)); 

以上内容会将gene_out[g].c_str()std::ios::binary转发给std::ifstream初始化构造函数。

explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in);

答案 1 :(得分:0)

由于您的平台是osx,而class="border"附带c ++ 11,请尝试将std::make_shared添加到clang ++ params。