Вот моя проблема, мне нужно создать X количество файлов и записать в них в зависимости от различных фактов, мое решение было создать вектор указателей ofstream, как это
#include <boost/algorithm/string.hpp>
#include <vector>
#include<string>
#include <iostream>
#include <fstream>
vector<ofstream*> files;
files.resize(SplitVec.size()-4);
for(i=0;i<SplitVec.size()-4;i++)
{
line="/Users/jorge/Desktop/testing/strain_"+lexical_cast<string>(i);
cout<<"ine"<<endl;
files[i]=new ofstream(line.c_str());
}
До этой части он создает файлы великолепно, а потом в программе, которую я пишу для них, и это тоже здорово, моя проблема в том, когда я хочу закрыть объекты, если я использую:
for(i=0;i<SplitVec.size()-4;i++)
{
*files[i].close();
}
Я получаю следующую ошибку:
In file included from main.cpp:14:./methyl.h:298: error: request for member 'close' in 'files. std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::ofstream*, _Alloc = std::allocator<std::ofstream*>](1ul)', which is of non-class type 'std::ofstream*'
Итак, у меня есть вопрос, во-первых, почему я не могу вызвать close, это указатель на ofstream, так что с * files [i] я бы подумал, что смогу закрыть его, во-вторых, если я не закрою его, Программа работает нормально, но я почти уверен, что это плохая практика и не хочу быть ленивым или дрянным программистом. Я выглядел так же, как мог, но я не смог найти ответ.
Спасибо!!!
Ваш код не является безопасным для исключения (например, если выдается исключение, поскольку у вас есть вектор сырье указатели, они утечка — со связанными ручками потока).
Я бы предложил современный C ++ RAII подход.
Например, если вы используете умный указатель, как shared_ptr
(из Boost или из C ++ 11 <memory>
заголовок), вы можете построить vector
из shared_ptr
и использовать make_shared
выделить ofstream
объекты:
// RAII exception-safe approach
vector<shared_ptr<ofstream>> files;
// Add a new ofstream object to the vector:
files.push_back( make_shared<ofstream>( filename ) );
Когда вектор выходит из области видимости, он разрушается, и все указанные объекты потока автоматически Выпущено: очень просто, понятно и безопасно для исключений.
Если вы хотите принудительно очистить потоки до того, как вектор выйдет из области видимости, вы можете просто вызвать .clear()
метод на вектор.
(Альтернативой может быть использование C ++ 11 двигаться семантике-питание unique_ptr
и определить vector<unique_ptr<ofstream>>
, но, к сожалению, нет стандартного эквивалента make_shared
за unique_ptr
и код может быть немного более многословным, если вы не напишите собственную реализацию make_unique
, лайк тот, который предложил Херб Саттер.)
Обратите внимание, что обычный files[i]->close()
Синтаксис применяется также в этом случае вектора умный указатели.
использование
(*files[i]).close();
или напрямую
files[i]->close();