【问题标题】:Open a variable number of ifstreams into a vector将可变数量的 ifstreams 打开到一个向量中
【发布时间】:2014-01-03 04:29:42
【问题描述】:

我是 C++ 新手,遇到了第一个无法通过谷歌搜索解决的问题。

我有一组数据文件,每行一条记录。每个文件都按一个键排序,但某些文件中缺少一些记录。我的计划是逐行解析这些数据,从最低记录中提取数据,并在适当的地方添加缺失的数据。

使用的文件数量会随着代码的一次运行而改变,因此保存文件流的类/容器可以是可变大小的(排除数组和我认为的指针向量)很重要.

这是我现在拥有的一个简单版本,它不会编译,因为 ifstreams 有一个已删除的复制构造函数(我认为 move 和 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;
}

【问题讨论】:

  • 试试emplace_back 而不是push_back。

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


【解决方案1】:

嗯,一个选项不是有一个向量 而是一个指向 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 ,而是在制作 shared_ptr。

【讨论】:

  • @jogojapan,是的,如果打算将 FileParser ptrs 存储到向量中而不是稍后传递指向它们的指针,我会同意你的观点,因为 unique_ptr 更快并且具有这些语义.但是,如果稍后需要获取 FileParse 指针的句柄并将其传递给其他一些辅助函数,那么 shared_ptr 是要走的路。我们没有更多的代码集,所以不知道这里哪个是正确的解决方案,但如果它如您所想,那么我会同意您和 unique_ptr 方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2011-11-14
相关资源
最近更新 更多