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

Posted

技术标签:

【中文标题】自动回调以关闭文件记录器类中包含的 fstream【英文标题】:Automatic callback to close fstream contained in file logger class 【发布时间】:2022-01-24 02:23:38 【问题描述】:

为了在我的 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_ 将关闭。 Unlreated: std::cout &lt;&lt; "Caught signal " &lt;&lt; signum &lt;&lt; ", starting exit procedure." &lt;&lt; std::endl; 在信号处理程序中不可移植。该标准在信号处理程序中允许的东西很少。 谢谢,关于文件句柄的自动关闭,你说得对。我想我被引导了一个坏例子,有人手动关闭它们。 不客气!是的,我见过很多这样的例子。由于作用域修复了流,因此很少在 C++ 中手动关闭流。如果我正在编写一个对同一个文件执行多个open 的函数,我什至更喜欢添加一个范围而不是关闭。 这些信息确实很有价值。即使没有它,我的代码现在也可以正常运行。 @TedLyngmo 你想添加一个简短的答案,以便我可以接受并关闭问题吗?我希望这个问题将来可以通过这种方式对其他人有用。非常感谢! 【参考方案1】:

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

【讨论】:

以上是关于自动回调以关闭文件记录器类中包含的 fstream的主要内容,如果未能解决你的问题,请参考以下文章

如何调用类中包含的异步函数?

VBA/VBScript提取Word(*.doc)文件中包含的图片(照片)

获取 zip 文件中包含的文件的文件列表

在 iOS 上使用下载包中包含的 XIB/NIB 文件

从应用程序中包含的文件加载 android 数组

从类中包含的结构访问变量