Я хочу открыть несколько текстовых файлов и сохранить потоки в виде вектора.
#include <vector>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
vector<string> imgSet
vector<ofstream> txtFiles;
// .
// .
for( int i=0 ; i<imgSet.size() ; i++ )
{
ofstream s;
s.open( imgSet[i].getName(), std::ofstream::out );
txtFiles.push_back( s );
}
}
getName выглядит так:
const string& getName() const;
Я компилирую это с помощью G++ на ubuntu, я не понимаю, почему я получаю с ним длинный список ошибок. Как это можно зафиксировать
В С++ 03 нет конструктора operator = или copy в std :: fstream. Вы можете сделать это:
vector<ofstream*> txtFiles;
//...
for( int i=0 ; i<imgSet.size() ; i++ )
{
txtFiles.push_back( new ofstream(imgSet[i].getName(), std::ofstream::out) );
}
Различные классы iostream не являются ни гибкими, ни присваиваемыми. В pre-С++ 11 элементы вектора должны быть обоими. Единственное решение - использовать вектор std::ofstream*
(возможно, завернутый в класс для обеспечения правильного удаления).
В С++ 11 классы iostream были сделаны подвижными, а вектор был расширен, чтобы позволить перемещаемые элементы. Таким образом, вы могли бы написать что-то вроде:
for ( std::string const& fileName : imgSet )
txtFiles.emplace_back( fileName );
Это предполагает более или менее поддержку С++ 11; Я не знаю статус g++, но это не соответствует той версии, которую я использую (4.8.3). Я думаю, что это скорее проблема библиотеки, чем компилятор, и она может работать с более новой версией библиотеки. (Не забудьте скомпилировать с -std=c++11
)
imgSet[i].getName()
?std::string
не имеет функции-членаgetName()
.