在c++中将fstream加载到std::向量中
loading fstreams into a std::vector in c++
这是一个既简单又复杂的问题。
这编译:
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
中记录fstream
s,则可以声明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){
...
}
相关文章:
- std::向量与传递值的动态数组
- 如何在旧c++中初始化const-std向量
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 如何初始化 std::向量的映射?
- 迭代时将指向differents类型的指针保存在std::向量中
- std::向量迭代器和调整大小/保留的奇怪/有趣行为
- yaml-cpp到std::向量迭代的怪异行为
- 故意泄漏std::向量的内存
- 调整STD ::向量的大小是否可以降低其能力
- std ::向量距离函数如何给出比.size()更高的值
- C++ std::向量插入两个元素替代算法失败
- 错误:数字常数之前的预期无限制ID:std :: array和std ::向量大小分配
- 在我提供的此示例中,如何将2维std ::向量的逻辑更改为具有向量[row] [col] [col] [col] [co
- GUI滑块的动态数量,该数量更新具有回调中值的std ::向量
- 是一个std ::向量线程,我的目的是安全的
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- 将std ::向量作为指针参考
- STD ::向量如何调整其内部缓冲区大小
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区