即使在函数退出后仍保持ofstream对象打开

时间:2014-02-17 21:14:39

标签: c++ visual-studio-2010

我在Visual Studio中有一个用c ++编写的代码,它基本上将一组浮点数(70个浮点)写入定时器的每个刻度上的二进制文件中。这些数字是从一台实验机器获得的。完成。

WriteToFile( float* buffer, int buffersize )   
    {
     ofstream out;
     out.open( filename,ios::app)
     for(int i =0;i< buffersize ;i++)     // buffersize is 70 here
             {  
               out.precision(6);
               out.setf(ios::fixed,ios::floatfield);
               out.write( (const char*) &buffer[i], sizeof(float));
             }
    }

对于计时器的每个刻度都会调用此函数。这需要花费很多时间,即使在实验完成后我还要等待程序获取数据并将其保存到文件中。原因是它减慢了down,对于每个tick都需要打开二进制文件并且必须找到它先前停止的位置。如果有一种方法我可以保持文件一直打开并且位置指针停在它停止的同一位置以前我可以加快速度。任何机构都有任何建议吗? 即使在函数退出后,基本上如何保持和保持开放?

1 个答案:

答案 0 :(得分:2)

C ++的方法是将计时器函数和流对象封装到类中,如下所示:

class BufferWriter
{
  std::ofstream out;

public:
  explicit BufferWriter(const std::string& filename)
    : out(filename.c_str(), std::ios::app)
  {
    out.precision(6);
    out.setf(std::ios::fixed, std::ios::floatfield);
  }

  void writeToFile(float *buffer, std::size_t bufferSize)
  {
    for (size_t i = 0; i < bufferSize; ++i) {
      out.write((const char*)(buffer + i), sizeof(float));
    }
  }
};

只需在某处创建此实例,并在每个计时器标记中调用其writeToFile()函数。实例销毁后,文件将被关闭。如果您愿意,也可以在每个flush()的末尾writeToFile()

要详细说明用例,你可以这样做:

int main()
{
  BufferWriter buf("MyBufferFile.dat");
  Timer t = createTimer();
  t.setTickCallback(buf, &BufferWriter::writeToFile);  // call buf.writeToFile() on each tick
  t.start();
  waitUntilFinished(t);
}

重要的一点是,只要整个计时器使用操作运行,BufferWriter实例就会存在。只要BufferWriter实例存在,其out成员也将存在,相应的文件将保持打开状态。