Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top