2016-05-19 121 views
0

我只是爲HLDS服務器擴展metamod編碼模塊。我寫了一個簡單的實用程序函數,用於以%LOGNAME%_%DATE%格式編寫日誌.log 在Windows中,該函數工作正常,但在Linux中它創建文件但不寫任何內容。 首先,我嘗試搜索有關這方面的信息,但我沒有找到解決方案。我嘗試沖洗文件句柄,將緩衝區設置爲_IONBF模式,但沒有任何幫助。非常感謝您閱讀本文並幫助我解決這個問題。Linux。不打印到文件

void UTIL_LogToFile(char* szFileName, const char *fmt, ...) 
{ 
va_list  argptr; 
va_start (argptr, fmt); 
vsnprintf (g_szLogString, sizeof(g_szLogString), fmt, argptr); 
va_end (argptr); 

char* szFilePath = new char[strlen(GlobalVariables::g_szDLLDirPath) + 12 + 30 + 1]; 
char* szLogFile = get_timestring("_%Y%m%d.log"); 
sprintf(szFilePath, "%slogs/%s%s", (GlobalVariables::g_szDLLDirPath), szFileName, szLogFile); 
FILE* hFile = fopen(szFilePath, "a+"); 
delete[] szFilePath; 
delete[] szLogFile; 
if(hFile == NULL) 
{ 
    char szError[256]; 
    sprintf(szError, "Error fopen: %s\n", strerror(errno)); 
    SERVER_PRINT(szError); 
    clearerr(hFile); 
    return; 
} 

fprintf(hFile, g_szLogString); 
if(ferror(hFile)) 
{ 
    char szError[256]; 
    sprintf(szError, "Error fprintf: %s\n", strerror(errno)); 
    SERVER_PRINT(szError); 
    clearerr(hFile); 
    return; 
} 
fclose(hFile); 

} 
+2

無關到您的問題,但爲什麼不使用'vfprintf'直接打印到文件,而不是使用臨時(和全局)緩衝區?而對於'sFilePath'和'szLogFile',爲什麼不使用'std :: string'? –

+1

你怎麼知道它給出了什麼錯誤?我沒有看到任何錯誤檢查代碼。 – Galik

+0

@JoachimPileborg在修復EAGAIN問題後,我會重構那些代碼,我只是不知道'vfprintf'。 我不使用'std :: string',因爲所有模塊的工作人員都是在「C」上寫的 – Inline

回答

2

你應該只檢查errno當且僅當以前的功能失效。

如果以前的調用沒有失敗,errno的值是undefined

因此,要正確檢查錯誤,你必須第一檢查,如果fopen調用返回一個空指針:

FILE* hFile = fopen(szFilePath, "a+"); 
if (hFile == nullptr) 
{ 
    perror(szFilePath); 
    return; 
}