在c++中将fstream加载到std::向量中

loading fstreams into a std::vector in c++

本文关键字:std 向量 加载 c++ 中将 fstream      更新时间:2023-10-16

这是一个既简单又复杂的问题。

这编译:

int Test;
vector<int> TEST;
TEST.push_back(Test);
cout << TEST.size();

这不会编译:

fstream Test;
vector<fstream> TEST;
TEST.push_back(Test);
cout << TEST.size();

有什么特别的原因吗?有没有一种方法可以让我获得fstream的动态列表?

错误消息:

1>------ Build started: Project: vector_test, Configuration: Debug Win32 ------
1>  vector_test.cpp
1>c:program files (x86)microsoft visual studio 10.0vcincludefstream(1347): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:program files (x86)microsoft visual studio 10.0vcincludeios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_fstream<_Elem,_Traits>::basic_fstream(const std::basic_fstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

对象fstream不可复制。

如果您需要在vector中记录fstreams,则可以声明std::vector<std::fstream*>并推回对象的地址。请记住,如果保存指针,则必须确保在访问它时,对象仍然处于活动状态。

在C++2011中,具体流对象是可移动的。然而,要利用这一点,你要么需要通过一个临时的,要么允许移动对象:

std::vector<std::ofstream> files;
files.push_back(std::ofstream("f1"));
std::ofstream file("f2");
files.push_back(std::move(file));

请注意,在此之后不能使用file变量,因为流已移动到files中。

若要将类与向量一起使用,它必须是可复制的。fstream不是。

请参阅:构造函数问题中的C++std::ifstream

编辑:如果需要对同一个fstream有多个引用,可以使用shared_ptr来管理它们。试试类似的东西:

std::vector< std::shared_ptr<fstream> > TEST

要将类型推送到向量中的一个基本要求是对象应该是可复制的,fstream不可复制,因此会出现编译器错误。

正如其他人所提到的,fstream是不可复制的。你可以做:

vector<fstream> TEST;
TEST.push_back(fstream()); //fstream is created in the vector, no copy needed

像这样使用:

fstream& A = TEST[0];

甚至像这样迭代:

for(fstream& S : TEST){
...
}