在向量中打开数量可变的ifstreams 我是C++新手,碰到了Google不能救我的第一个问题。
我有一组数据文件,每行一条记录。每个文件都按键排序,但某些文件中缺少一些记录。我的计划是逐行解析这些数据,从最低的记录中提取数据,并在需要的地方添加缺失的数据 使用的文件数量将随着代码的运行而变化,因此保存文件流的类/容器的大小可以是可变的,这一点很重要(我认为,排除了数组和指针向量) 这是我现在拥有的一个简单版本,它不会编译,因为ifstreams有一个已删除的复制构造函数(我认为move和c++11可能会让我从中受益,显然不是)。正如我所说,这是我学习C++的第一周,如果有一种完全不同的方法更适合这个问题,我很高兴听到它在向量中打开数量可变的ifstreams 我是C++新手,碰到了Google不能救我的第一个问题。,c++,c++11,vector,copy-constructor,ifstream,C++,C++11,Vector,Copy Constructor,Ifstream,我有一组数据文件,每行一条记录。每个文件都按键排序,但某些文件中缺少一些记录。我的计划是逐行解析这些数据,从最低的记录中提取数据,并在需要的地方添加缺失的数据 使用的文件数量将随着代码的运行而变化,因此保存文件流的类/容器的大小可以是可变的,这一点很重要(我认为,排除了数组和指针向量) 这是我现在拥有的一个简单版本,它不会编译,因为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;i cout好的,一个选项不是让向量而是让智能指针向量指向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方法。谢谢。