gpt4 book ai didi

C++ ofstream 不在程序的后续运行中创建和写入文件

转载 作者:行者123 更新时间:2023-11-30 05:17:11 25 4
gpt4 key购买 nike

#include <iostream>

#define LOGFATAL(msg) log(0, msg)

std::ofstream *logst = NULL;

void log(int sev, char *msg)
{ if (logst == NULL) {
logst = new std::ofstream();
logst->open("filea.txt", std::ios::out | std::ios::app);
*logst << "Logger started." << std::endl;
}

std::ofstream &_log = *logst;
_log << msg << std::endl;
_log.flush();
}

int main()
{ LOGFATAL("Log msg1.");
LOGFATAL("Log msg2.");
LOGFATAL("Log msg3.");

logst->close();
delete logst;
}

我在第一次登录时打开一个文件进行记录,并一直保持打开状态直到程序结束。

因为我在每次日志调用后都使用了 flush() 操作,所以我希望看到我的消息立即打印出来。但这并没有发生。为什么?

目前,我在程序完成前使用 Ctrl+C 终止我的程序(不要问我为什么)。在程序的后续运行中,我什至没有看到日志文件被创建,即使它已经存在,我也没有看到任何日志被添加。由于我不让 close() 执行,文件描述符是否会泄露并防止 future 新程序的 open() 失败?

我在 RHEL 7.2 上运行它,我假设现在大多数新操作系统的句柄即使 close() 没有被意外调用。考虑到 Ctrl+C 是目前停止我的程序的唯一方法,我该怎么做才能让我的程序在每次启动时都正确记录?

有没有办法从系统 shell 检查我的日志文件是否有任何泄漏的文件描述符?

最佳答案

插入 std::endl 本身会刷新数据。即使 _log.flush(); 被评论,它也对我有用。

“我希望立即看到我的消息打印出来”。如果您使用的是 vim,那么您需要关闭并重新打开该文件。因此,如果数据写入文件,请使用 tail -F filea.txt 立即查看输出。

关于C++ ofstream 不在程序的后续运行中创建和写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42244607/

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