2013-05-22 35 views
0

我的程序將各種日誌信息保存到文本文件中。但是,如果程序由於內存訪問衝突等問題而崩潰,則日誌文本文件中沒有任何內容。保存日誌文本文件而不管崩潰

我相信這是因爲程序未能關閉打開的日誌文本文件。

目前,我正在使用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); 
    } 
+0

顯示您使用的是記錄錯誤的代碼?在過去,我記得不得不調用'FileStream.Flush()',以便在進程終止之前將內容寫出到文件中。 –

+0

當前代碼通過使用FILE *指針非常簡單。我將編輯我的原始帖子以顯示我的代碼。謝謝。 – diehard98

+0

看起來像你已經得到了你的答案 - 如果你發佈代碼,以便沒有人被猜測,未來將更容易。 –

回答

1

您可以嘗試使用fflush()迫使文件I/O操作。每次在日誌中寫入時都可以這樣做,以確保儘可能多地寫入儘可能多的數據。

雖然我建議,因爲你使用的是C++,採用fstream代替FILE*

+0

或者你也可以使用依賴於操作系統的文件寫入(在Windows中爲'CreateFile',在Unices中爲'open'),因爲它們不使用中間內存緩衝。使用'fstream',也需要'flush'調用。 – Liviu

+0

感謝您的快速回復!它確實與'fflush()'一起工作。我想遵循您使用'fstream'而不是'FILE *'的建議。我相信'fstream'比FILE *更好,但是你能告訴我爲什麼'fstream'更好嗎?謝謝。 – diehard98

+0

我在這裏發現了一些關於我的問題的答案。 http://stackoverflow.com/questions/5570361/file-vs-fstream – diehard98