Имена динамических выходных файлов (C++)
-
19-09-2019 - |
Вопрос
Я пытаюсь создать выходные файлы с индексом динамического индекса ( d = {0,...,NUM_DEMES-1}).В настоящее время я получаю выходные файлы только для первого значения (d=0).
#include <sstream>
#include <string>
void Simulation::updateSimulation( double t )
{
...
ofstream abundanceStream;
ofstream abHeaderStream;
if ( step == 1 ) {
for ( int d = 0; d < NUM_DEMES; d++ ) {
abundanceStream.open( makeFilename( "Abundances_", d ).c_str(),ios::out);
abHeaderStream.open( makeFilename( "Abundances_IDs_", d ).c_str(),ios::out);
}
}
for ( int d = 0; d < NUM_DEMES; d++ ) {
abundanceStream.open( makeFilename( "Abundances_", d ).c_str(),ios::app);
abHeaderStream.open( makeFilename( "Abundances_IDs_", d ).c_str(),ios::app);
}
}
string Simulation::makeFilename( const string& basename, int index )
{
ostringstream result;
result << basename << index;
return result.str();
}
Это создает Abundances_0 и Abundances_IDs_0, но ничего больше.Я могу писать в эти файлы.Я могу прекрасно создать другие имена файлов, но файлы просто не появляются.
Вероятно, мне не хватает чего-то основного в потоках, но я не смог понять, что именно.
РЕДАКТИРОВАТЬ
Следующий код выводится для проверки правильных имен файлов:
for ( int d = 0; d < NUM_DEMES; d++ ) {
abundanceStream.open( makeFilename( "Abundances_", d ).c_str(),ios::app);
abundanceStream << "stuff\n";
cout << makeFilename( "Abundances_", d ).c_str() << endl;
abHeaderStream.open( makeFilename( "Abundances_IDs_", d ).c_str(),ios::app);
abHeaderStream << "more stuff\n";
cout << makeFilename( "Abundances_IDs_", d ).c_str() << endl;
}
Но «вещи» и «еще вещи» появляются только в Abundances_0 и Abundances_IDs_0.
Решение
Вы всегда используете одни и те же объекты.Вы можете либо закрыть потоки после «использования», либо использовать разные объекты для каждого файла.
Другие советы
После открытия потока произойдет еще один вызов open
потерпит неудачу, если вы сначала не закроете его.Поэтому либо добавьте вызовы в abundanceStream.close()
и abHeaderStream.close()
в конце каждого цикла или охватить объекты потока внутри цикла, чтобы каждый раз получать новый.