Pergunta

Estou tentando criar arquivos de saída subscritos por um índice dinâmico (d = {0, ..., num_demes-1}). Atualmente, estou obtendo apenas arquivos de saída para o primeiro valor (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();
}

Isso cria abundâncias_0 e abundances_ids_0, mas nada mais. Eu posso escrever para esses arquivos. Eu posso criar os outros nomes de arquivos muito bem, mas os arquivos simplesmente não aparecem.

Provavelmente estou perdendo algo básico sobre fluxos, mas não consegui descobrir o quê.

EDITAR

O código a seguir imprime para rastrear os nomes de arquivos corretos:

  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;
  }

Mas "coisas" e "mais coisas" aparecem apenas nas abundâncias_0 e abundâncias_ids_0.

Foi útil?

Solução

Você está sempre usando os mesmos objetos. Você pode fechar os fluxos após "usar" ou usar objetos diferentes para cada arquivo.

Outras dicas

Depois de abrir um fluxo, outra chamada para open falhará a menos que você o feche primeiro. Portanto, adicione chamadas para abundanceStream.close() e abHeaderStream.close() No final de cada loop, ou escopo os objetos do fluxo dentro do loop, para que você obtenha um novo a cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top