Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在向量中打开数量可变的ifstreams 我是C++新手,碰到了Google不能救我的第一个问题。_C++_C++11_Vector_Copy Constructor_Ifstream - Fatal编程技术网

在向量中打开数量可变的ifstreams 我是C++新手,碰到了Google不能救我的第一个问题。

在向量中打开数量可变的ifstreams 我是C++新手,碰到了Google不能救我的第一个问题。,c++,c++11,vector,copy-constructor,ifstream,C++,C++11,Vector,Copy Constructor,Ifstream,我有一组数据文件,每行一条记录。每个文件都按键排序,但某些文件中缺少一些记录。我的计划是逐行解析这些数据,从最低的记录中提取数据,并在需要的地方添加缺失的数据 使用的文件数量将随着代码的运行而变化,因此保存文件流的类/容器的大小可以是可变的,这一点很重要(我认为,排除了数组和指针向量) 这是我现在拥有的一个简单版本,它不会编译,因为ifstreams有一个已删除的复制构造函数(我认为move和c++11可能会让我从中受益,显然不是)。正如我所说,这是我学习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;
}
#包括
#包括
#包括
使用名称空间std;
类文件解析器{
ifstream文件\u流;
公众:
文件解析器(字符串);
字符串next();
};
FileParser::FileParser(字符串fname){
文件\u stream.open(fname);
}
字符串文件解析器::next(){
字符串L;
getline(文件流,L);
//做大量的分析。。。
返回L;
}
int main(){
向量fnames={“test1”,“test2”};
向量分析器;
对于(size_t i=0;icout好的,一个选项不是让向量而是让智能指针向量指向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") );
vectorv;
v、 推回(共享ptr(新的ifstream(“test1”));
或者更好,
v、 向后推(使共享(“文件1”);

实际上,在你的例子中,你不是在做一个共享的\u ptr,而是在做一个共享的\u ptr

尝试
emplace\u back
而不是
push\u back
@jogojapan,是的,如果目的是将文件解析器ptr存储到向量中,而不是稍后传递指向它们的指针,我会同意你的观点,因为独特的\u ptr更快、更安全但是,如果以后需要获取FileParse指针的句柄并将其传递给其他帮助函数,然后共享\u ptr是一种方式。我们并没有更大的代码集,所以不知道哪种解决方案是正确的,但如果它是如您所想的,那么我会同意您和独特的\u ptr方法。谢谢。