Динамические выходные имена файлов (C ++) - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь создать выходные файлы, подписанные динамическим индексом (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, но больше ничего. Я могу написать в эти файлы. Я могу просто создать другие имена файлов, но файлы просто не появляются.

Я, вероятно, упускаю что-то базовое о потоках, но я не смог понять, что именно.

EDIT

Следующий код печатается для отображения правильных имен файлов:

  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.

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

После того, как вы открыли поток, другой вызов open не будет выполнен, если вы сначала не закроете его. Поэтому добавьте вызовы к abundanceStream.close() и abHeaderStream.close() в конце каждого цикла или поместите объекты потока внутри цикла, чтобы каждый раз получать новый объект.

4 голосов
/ 12 ноября 2009

Вы всегда используете одни и те же предметы. Вы можете либо закрыть потоки после «использования», либо использовать разные объекты для каждого файла.

...