我只是爲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);
}
無關到您的問題,但爲什麼不使用'vfprintf'直接打印到文件,而不是使用臨時(和全局)緩衝區?而對於'sFilePath'和'szLogFile',爲什麼不使用'std :: string'? –
你怎麼知道它給出了什麼錯誤?我沒有看到任何錯誤檢查代碼。 – Galik
@JoachimPileborg在修復EAGAIN問題後,我會重構那些代碼,我只是不知道'vfprintf'。 我不使用'std :: string',因爲所有模塊的工作人員都是在「C」上寫的 – Inline