【问题标题】:Saving log text file regardless of crashing保存日志文本文件而不考虑崩溃
【发布时间】:2013-05-22 14:19:33
【问题描述】:

我的程序将各种日志信息保存到文本文件中。但是如果程序由于内存访问冲突等问题而崩溃,则日志文本文件中没有任何内容。

我相信是因为程序未能关闭打开的日志文本文件。

目前,我使用 FILE* 来保存日志文本文件。我可能每次都可以打开和关闭来写每个日志,但我认为这太开销了。

无论程序崩溃或意外停止,是否有任何其他方法可以保留日志?

我确实想在程序崩溃之前查看日志。

我正在为我的程序使用 C++/CLI。非常感谢您。

    FILE* logfile;        
    errno_t err;
    char LogFileNameBuf[512] = {0,};
    sprintf_s(LogFileNameBuf, "LogFile.txt");
    err = fopen_s(&logfile, LogFileNameBuf, "wt");

    if(logfile != NULL)
    {
        bLogfile = true;
        GetLocalTime(&st);
        sprintf_s(logBuf, "[%04d-%02d-%02d][%02d:%02d:%02d] SUCCESS:: Log Started\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
        fputs(logBuf, logfile); 
    }

    // close log file
    if(bLogfile == true) 
    {
        GetLocalTime(&st);
        sprintf_s(logBuf, "[%04d-%02d-%02d][%02d:%02d:%02d] SUCCESS:: Log File Closed\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
        fputs(logBuf, logfile);
        fclose(logfile);
    }

【问题讨论】:

  • 显示您用来记录错误的代码?过去,我记得必须调用 FileStream.Flush() 以便在进程终止之前将内容写入文件。
  • 当前代码使用 FILE* 指针非常简单。我将编辑我的原始帖子以显示我的代码。谢谢。
  • 看起来你已经得到了答案——如果你发布代码,那么将来每个人都会更容易,这样就不会有人猜测了。
  • 谢谢,马特。从现在开始我会这样做。

标签: c++ c++-cli


【解决方案1】:

您可以尝试使用fflush() 在文件中强制执行 I/O 操作。您可以在每次写入日志时都这样做,以确保实际写入尽可能多的数据。

虽然我建议,当您使用 C++ 时,使用 fstream 而不是 FILE*

【讨论】:

  • 或者您可以使用依赖于操作系统的文件写入(Windows 中的CreateFile,Unices 中的open),因为它们不使用中间内存缓冲。使用fstream,还需要调用flush
  • 感谢您的快速回复!它确实适用于“fflush()”。我想听从你的建议,使用“fstream”而不是“FILE*”。我确信 'fstream' 比 FILE* 好,但你能告诉我为什么 'fstream' 更好吗?谢谢。
  • 我在这里找到了关于我的问题的答案。 stackoverflow.com/questions/5570361/file-vs-fstream
  • @diehard98 并没有那么好,但它肯定有一些有价值的优点,比如你不必携带指针的脸、异常安全、封装等。但这已经在您链接的帖子中列出/讨论。 :)
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多