自动回调以关闭文件记录器中包含的 fstream class
Automatic callback to close fstream contained in file logger class
为了在我的 C++ 应用程序的不同部分记录不同的值,我希望能够实例化一个 class,它抽象了在文件中记录不同值所需的所有命令。这是 class:
的原型 header
#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_;
....
};
我现在遇到的问题是,每个 class 都需要在程序终止之前使用方法 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 class 实例的所有必需 fileHandle_
的唯一方法是全局定义它们并手动将 fileLogger.closeFileHandle();
添加到回调函数。由于多种原因,这是不可取的。
因此,我想知道是否有一种方法可以在 class 本身中以某种方式包含在退出程序时关闭文件句柄的功能,从而 class 可以被实例化代码中的任何地方?或者,如果那不可能,我该如何以其他方式处理问题?
销毁每个 FileLogger
会自动解决这个问题,因为 fileHandle_
将在 FileLogger
超出范围或调用 std::exit
时关闭。
为了在我的 C++ 应用程序的不同部分记录不同的值,我希望能够实例化一个 class,它抽象了在文件中记录不同值所需的所有命令。这是 class:
的原型 header#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_;
....
};
我现在遇到的问题是,每个 class 都需要在程序终止之前使用方法 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 class 实例的所有必需 fileHandle_
的唯一方法是全局定义它们并手动将 fileLogger.closeFileHandle();
添加到回调函数。由于多种原因,这是不可取的。
因此,我想知道是否有一种方法可以在 class 本身中以某种方式包含在退出程序时关闭文件句柄的功能,从而 class 可以被实例化代码中的任何地方?或者,如果那不可能,我该如何以其他方式处理问题?
销毁每个 FileLogger
会自动解决这个问题,因为 fileHandle_
将在 FileLogger
超出范围或调用 std::exit
时关闭。