用c++将fstream装入std::vector

nvbavucw  于 2023-02-26  发布在  其他
关注(0)|答案(5)|浏览(300)

这是一个既简单又复杂的问题。
这将编译:

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.0\vc\include\fstream(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.0\vc\include\ios(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 ==========
bmvo0sr5

bmvo0sr51#

对象fstream不可复制。
如果你需要在一个vector中记录fstream,你可以声明一个std::vector<std::fstream*>,并将对象的地址推回。记住,如果你保存了指针,那么你必须确保,当你访问它时,对象仍然是活的。

v1l68za4

v1l68za42#

在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中。

gorkyyrv

gorkyyrv3#

要使用带有向量的类,它必须是可复制的。fstream不是。
参见:C++ std::ifstream in constructor problem

    • 编辑:**如果你需要对同一个fstream有多个引用,你可以使用shared_ptr来管理它们。
std::vector< std::shared_ptr<fstream> > TEST
5ktev3wc

5ktev3wc4#

将类型推入vector的基本要求是对象应该是可复制的,fstream是不可复制的,因此会出现编译器错误。

unhi4e5o

unhi4e5o5#

就像其他人提到的,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){
...
}

相关问题