2016-05-19 15 views
0

私はちょうど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); 

} 
+2

無関係問題はありますが、なぜ一時的な(そしてグローバルな)バッファを使うのではなく、 'vfprintf'を使ってファイルに直接印刷するのですか? 'szFilePath'と' szLogFile'の 'std :: string'を使っていないのはなぜですか? –

+1

どのようなエラーが発生したのか、どのように知っていますか?エラーチェックコードは表示されません。 – Galik

+0

@JoachimPileborg EAGAINの問題を修正した後、私はそのコードをリファクタリングします。私は 'vfprintf'について知らなかっただけです。 "std :: string"を使用していません。すべてのモジュールスタッフが "C"でwritedされています。 – Inline

答えて

2

と場合にのみ、前の関数が失敗した場合にのみ、errnoをチェックする必要があります。

前の呼び出しが失敗しなかった場合、errnoの値はで、定義されていないのはです。

fopen呼び出しはNULLポインタを返したのであれば、適切にあなたが最初チェックしなければならないエラーをチェックします

FILE* hFile = fopen(szFilePath, "a+"); 
if (hFile == nullptr) 
{ 
    perror(szFilePath); 
    return; 
}