自动回调以关闭文件记录器类中包含的fstream



要在c++应用程序的不同部分中记录不同的值,我希望能够实例化一个类,该类抽象了在文件中记录不同值所需的所有命令。这是类的原型头:

#include <string.h>
#include <fstream>
#include <iostream>
#include <Eigen/Dense>
....
class FileLogger {
public:
FileLogger(const std::string& log_name, const std::string& columnNames, const uint& columnCount, const double& timerOffsetSeconds = 0);
// Checks if logging of previous timestamp is completed and 
//starts a new row with logging the current time. 
void startNewTimestamp();
// different predefined methods to log several data types
void logScalar(const double& value);
void logVector(const Eigen::VectorXd& values);
template <int SIZE, typename TYPE>
void logArray(TYPE (&values)[SIZE]) {
for (int i; i < SIZE; i++) {
fileHandle_ << values[i] << ",";
currentColumnCount_ += 1;
}
}
// Method to close the fileHandle_ of the class
void closeFileHandle();
private:
void checkLastTimestampCompletion();
uint countColumnNames();
std::string file_name_;
uint currentColumnCount_;
const uint columnCount_;
const std::string columnNames_;
std::ofstream fileHandle_;
....
};

我现在遇到的问题是,在程序终止之前,每个类都需要使用方法closeFileHandle()关闭它的fileHandle_,以便获得工作日志。由于程序通常使用CTL +C终止,因此这需要在信号回调中发生。我发现终止信号可以用于执行如下回调函数:

...
#include <signal.h>
#include <iostream>
void signal_callback_handler(int signum) {
std::cout << "Caught signal " << signum << ", starting exit procedure." << std::endl;
.... do something ...
exit(1);
}
int main(){
.... 
signal(SIGINT, signal_callback_handler);
....
}

关闭FileLogger类的每个实例所需的所有fileHandle_的唯一方法是全局定义它们,并手动将fileLogger.closeFileHandle();添加到回调函数中。由于多种原因,这是不可取的。

因此,我想知道是否有一种方法可以在某种程度上包含在退出类中的程序时关闭文件句柄的功能,从而使类可以在代码中的任何位置实例化?或者,如果这不可能,我该如何用另一种方式处理这个问题?

销毁每个FileLogger会自动解决此问题,因为当FileLogger超出范围或调用std::exit时,fileHandle_将关闭。

最新更新