gpt4 book ai didi

c++ - 写入未打开的流

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:13 26 4
gpt4 key购买 nike

我的应用程序需要非常简单的记录器。但有时我不想使用这个记录器来加速我的应用程序。

我的记录器看起来像:

class Logger
{
public:
Logger(bool isActive = true)
{
mIsActive = isActive;
if (isActive)
{
out.open(pathToLogFile);
}
}

static std::ofstream& log()
{
return out;
}
private:
static bool mIsActive;
static std::ofstream out;
};

在我的应用程序中,我将其用作:

Logger(true);  // in one place
Logger::log() << "Log" << std::endl;

如果我不想使用这个记录器怎么办?

Logger(false);  // in one place. it doesn't open any file.
Logger::log() << "Log" << std::endl; // it shouldn't write anywhere

如果我还没有打开文件,<< 运算符的行为是什么?安全吗?是不是很快?这是个好主意吗??

最佳答案

您的记录器有几个问题。

如果您使用 operator<< 在停用的记录器上,没有任何反应,但是 out 的状态stream 设置为失败,它将保留它直到您重置它。这意味着如果您随后重新激活您的记录器,则不会再向其写入任何内容。

如果您在记录器已经处于事件状态时重新激活它,则同样如此: out.open() 也会失败,什么都不会再写了。

如果你想保留这个设计,你必须更新你的记录器,如果out 就检查你的构造函数。已经打开(使用 out.is_open() ),如果需要 clear() 错误标志。

附录:如果您担心所有这些的性能 <<这将在记录器停用时不必要地处理假设输出,那么您可以考虑使用自定义 operator<<对于您的记录器类,这将考虑 mIsActive .这SO answer在另一个问题上显示了它是如何工作的。

关于c++ - 写入未打开的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com