私はちょうどHLDSサーバー拡張メタモジュールのモジュールをコーディングしています。私は、ログを%LOGNAME%_%DATE%.log形式で書くためのシンプルなユーティリティ関数を書いた。 機能は正常に動作しているが、Linuxではファイルを作成するが何も書いていない。 まず、その情報を検索しようとしますが、解決策が見つかりません。私はファイルハンドルをfflushしようとすると、_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'を使ってファイルに直接印刷するのですか? 'szFilePath'と' szLogFile'の 'std :: string'を使っていないのはなぜですか? –
どのようなエラーが発生したのか、どのように知っていますか?エラーチェックコードは表示されません。 – Galik
@JoachimPileborg EAGAINの問題を修正した後、私はそのコードをリファクタリングします。私は 'vfprintf'について知らなかっただけです。 "std :: string"を使用していません。すべてのモジュールスタッフが "C"でwritedされています。 – Inline