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

时间:2017-02-15 08:52:38

标签: c++ fstream file-handling ofstream

#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()执行,文件描述符是否会泄露并阻止新程序的未来open()失败?

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

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

2 个答案:

答案 0 :(得分:1)

插入For rowIndex = 0 To DataGridView1.RowCount - 1 Dim rValue = DataGridView1.Rows(rowIndex).Cells("AC_RECEIVEDDT").Value If DateTime.TryParse(rValue, received) Then difference = today.Subtract(received) If difference.Days < 2 Then DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.green ElseIf difference.Days = 2 Then DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.yellow Else DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.red End If Else MessageBox.Show("not a DateTime") End If Next 本身会刷新数据。即使std::endl被评论,它也适用于我。

“我希望我的消息能够立即打印出来”。如果您使用_log.flush();,则需要关闭并重新打开该文件。因此,如果数据写入文件,请使用vim立即查看输出。

答案 1 :(得分:0)

采取以下步骤验证一些假设:

1。)将文件改为std::fstream。写入第一条日志消息后,将文件指针重置为开头并读取文件的内容。 您应该从打开的文件中获取日志消息。如果没有,那么您可能会损坏内存。

2.。)写完第一条日志消息后,用std::ifstream打开文件并阅读其内容。 您应该从std::ifstream收到日志消息。如果没有,那么可能有另一个进程干扰了您的文件。

注意:操作系统需要一些时间才能使文件更改对其他进程可见。在高负载下,我观察到几百毫秒的延迟,例如,直到消息显示在tail -f