在C++中,关闭类成员函数内的静态文件流
In C++, close a static file stream inside a class member function
我有一个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
成员变量可能需要单独的声明和定义)。
相关文章:
- enable_if转换构造函数(静态强制转换,is_base_of)
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- C++ - 模板类 -> 静态函数 -> 静态函数指针的链接错误
- 获取 llvm::函数静态地址
- 成员函数静态变量与成员变量
- 如何将sqlite3+扩展函数静态链接到C/C++应用程序中
- Visual Studio 2015 Natvis如何显示函数静态变量
- 返回一个指向函数静态数据的指针合适吗
- 如何将函数静态应用于非类型模板包的各个元素并对结果求和
- 是否可以通过编程方式创建函数静态对象
- 函数静态变量析构函数和线程
- 函数静态成员变量
- 隐藏模板化的辅助函数——静态成员或未命名的命名空间
- 这个解决方案对MSVC的双重检查锁定错误和函数静态有什么问题?
- 类成员函数静态和私有
- c++函数静态局部,性能好
- 函数静态变量初始化
- 使用基类中的函数静态地调用纯虚函数的派生类实现
- 使成员函数静态会使程序无法编译。想不通为什么