我是C ++的新手,并且遇到了谷歌搜索无法拯救我的第一个问题。
我有一组数据文件,每行一条记录。每个文件都按键排序,但某些文件中缺少某些记录。我的计划是逐行解析这些数据,从最低记录中提取数据并在其中添加缺失数据。
使用的文件数量将从一次运行代码更改为下一次运行,因此保存文件流的类/容器可以是可变大小的(排除数组,我认为是指针的向量)很重要。
这是我现在所拥有的一个简单的版本,它不会编译,因为ifstreams有一个删除的复制构造函数(我认为移动和c ++ 11可能有我这个,显然不是)。正如我所说,这是我第一周的C ++,如果有一个完全不同的方法更适合我能乐于听到它的问题。
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
class FileParser{
ifstream file_stream;
public:
FileParser(string);
string next();
};
FileParser::FileParser(string fname){
file_stream.open(fname);
}
string FileParser::next(){
string L;
getline(file_stream, L);
// do lots of parsing...
return L;
}
int main(){
vector<string> fnames = {"test1", "test2"};
vector<FileParser> parsers;
for(size_t i = 0; i < fnames.size(); ++i){
FileParser p (fnames[i]);
parsers.push_back( move(p) )
}
//loop through all files, find matching records, do stuff
cout << parsers.size() << endl;
return 0;
}
答案 0 :(得分:2)
嗯,一个选择是没有矢量&lt; FileParser&gt;而是一个指向FileParser对象的智能指针的向量,因此不会发生复制ifstream,因为ifstream只有一次实例,而每个智能指针实例只是创建了对ifstream的另一个引用。
vector< shared_ptr<ifstream> > v;
v.push_back( shared_ptr<ifstream>(new ifstream("test1") ) );
or better yet,
v.push_back( make_shared<ifstream>("file1") );
实际上,在你的情况下,你没有制作一个shared_ptr&lt; ifstream&gt;而是shared_ptr&lt; FileParser&gt;。