我只是为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