c++ - 即使在函数退出后也保持 ofstream 对象打开

标签 c++ visual-studio-2010

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

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

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

最佳答案

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() 函数。当实例被销毁时,文件将被关闭。如果需要,您还可以在每个 writeToFile() 的末尾 flush()

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

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 成员也将存在,相应的文件将保持打开状态。

关于c++ - 即使在函数退出后也保持 ofstream 对象打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21839386/

相关文章:

C++ 返回指针与使用 std::move 返回本地对象

c# - 为什么我在文本框中得到无效输出?

c - HDF-EOS5 中的 MSVS 2010 C 代码错误

c# - 清理 C# visual studio 2010 的 bin obj 文件夹

c++ - 如何专门化 'partially'成员方法?

c++ 多项式复制构造函数和 ostream 覆盖导致内存泄漏?!

c++ - 怎么解释函数count的位数是奇数还是偶数

c++ - Std::pair/ostringstream 构造函数语法

visual-studio-2010 - 使用 Visual Studio 调试器附加到可执行文件

c++ - 在visual studio中,在c++项目的项目属性中,引用窗口是什么?