我在 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/