Linux。不打印到文件
Linux. Not printing to file
我只是为 HLDS 服务器扩展元模型编码模块。我编写了一个简单的实用程序函数,用于以 %LOGNAME%_%DATE%.log 格式写入日志
在 windows 中该函数工作正常,但在 linux 中它创建文件但什么也不写。
首先,我尝试搜索相关信息,但没有找到解决方案。我尝试 fflush 文件句柄,将缓冲区设置为 _IONBF 模式,但没有任何帮助。非常感谢您阅读本文并帮助我解决这个问题。
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);
}
你应该只检查 errno
当且仅当 前一个函数失败。
如果之前的调用没有失败,errno
的值是 undefined。
因此,要正确检查错误,您必须首先检查fopen
调用是否返回空指针:
FILE* hFile = fopen(szFilePath, "a+");
if (hFile == nullptr)
{
perror(szFilePath);
return;
}
错误在其他函数中:
更改的源代码:https://github.com/In-line/metamod_unprecacher/commit/08b2fabd03f838bee62913b0d2a4f4a4bbf1e6df
我只是为 HLDS 服务器扩展元模型编码模块。我编写了一个简单的实用程序函数,用于以 %LOGNAME%_%DATE%.log 格式写入日志 在 windows 中该函数工作正常,但在 linux 中它创建文件但什么也不写。 首先,我尝试搜索相关信息,但没有找到解决方案。我尝试 fflush 文件句柄,将缓冲区设置为 _IONBF 模式,但没有任何帮助。非常感谢您阅读本文并帮助我解决这个问题。
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);
}
你应该只检查 errno
当且仅当 前一个函数失败。
如果之前的调用没有失败,errno
的值是 undefined。
因此,要正确检查错误,您必须首先检查fopen
调用是否返回空指针:
FILE* hFile = fopen(szFilePath, "a+");
if (hFile == nullptr)
{
perror(szFilePath);
return;
}
错误在其他函数中: 更改的源代码:https://github.com/In-line/metamod_unprecacher/commit/08b2fabd03f838bee62913b0d2a4f4a4bbf1e6df