我有可变数量的二进制文件(超过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(...)
编辑:编译错误是由于我的代码中出现了拼写错误。所以我在这个帖子中的所有问题都得到解决。
答案 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。