2016-05-19 124 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; 
}