在C++中,关闭类成员函数内的静态文件流

In C++, close a static file stream inside a class member function

本文关键字:函数 静态 文件 成员 C++      更新时间:2023-10-16

我有一个C++程序(在Visual C++ 2017中开发),需要输出大量行到文件中。以下是简化版本,只是为了说明问题。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <filesystem>
#include <algorithm>
#include <numeric>
#include <fstream>
using namespace std;
class Test{
public:
void output(int a){
static ofstream out("a.txt", fstream::in | fstream::out | fstream::app);
out<<a<<"n";
}
};
int main()
{
Test t;
for(int i = 0; i < 10; i++){
t.output(i);
}
t.~Test();
remove("a.txt");
}

删除("a.txt")永远不会起作用。我知道文本文件从未正确关闭。我显式调用 t.~Test() 希望它会关闭静态流,但似乎 id 不起作用。

使ofstream静态的原因是它显着提高了我的生产代码的性能,因为我假设它只打开文件一次并使用它,而不是为每个调用打开和关闭文件

我知道设计很糟糕,但这来自遗留代码,我不愿意更改函数签名。

有没有一种简单的方法可以在不更改"out"函数签名的情况下完成这项工作?谢谢

局部静态变量的生命周期是程序本身的生命周期。在程序退出之前,它不会被销毁。

解决问题的一种可能方法是改用类中的成员变量。在构造函数中打开流,并在析构函数中关闭它。如果类的多个对象需要共享流,则它们使其成为由其定义打开的static成员变量(请记住,static成员变量可能需要单独的声明和定义)。