动态输出文件名(C ++)

时间:2009-11-12 19:42:04

标签: c++ ofstream ostringstream

我正在尝试创建动态索引下标的输出文件(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中。

2 个答案:

答案 0 :(得分:4)

您始终使用相同的对象。您可以在“使用”后关闭流,也可以为每个文件使用不同的对象。

答案 1 :(得分:4)

一旦您打开了一个流,除非您先关闭它,否则对open的另一个调用将失败。因此,要么在每个循环结束时添加对abundanceStream.close()abHeaderStream.close()的调用,要么在循环内对流对象进行范围调整,以便每次都获得一个新对象。