【问题标题】:Dynamic output filenames (C++)动态输出文件名 (C++)
【发布时间】:2009-11-12 19:42:03
【问题描述】:

我正在尝试创建由动态索引 (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 中。

【问题讨论】:

  • 每次调用的 result.str() 的值是多少? NUM_DEMES 设置为什么?
  • NUM_DEMES 的值是多少?
  • 对不起。 NUM_DEMES = 2,并且 d 正确递增。 Result.str() 也检查得很好(即, cout

标签: c++ ofstream ostringstream


【解决方案1】:

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

【讨论】:

  • 忘记了这个非常重要的原则。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多