0

動的インデックス (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;
  }

ただし、"stuff" と "more stuff" は Abundances_0 と Abundances_IDs_0 にのみ表示されます。

4

2 に答える 2

4

ストリームを開くと、open最初に閉じない限り、への別の呼び出しは失敗します。したがって、各ループの最後に呼び出しを追加するかabundanceStream.close()abHeaderStream.close()ループ内のストリームオブジェクトのスコープを設定して、毎回新しい呼び出しを取得します。

于 2009-11-12T19:50:29.387 に答える
4

常に同じオブジェクトを使用しています。「使用」後にストリームを閉じるか、ファイルごとに異なるオブジェクトを使用できます。

于 2009-11-12T19:47:14.000 に答える