将可变数量的ifstream打开到向量中

时间:2014-01-03 04:29:43

标签: c++ c++11 vector copy-constructor ifstream

我是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;
}

1 个答案:

答案 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;。