0

私のロギングクラスを検討してください

void LogWriter::InitLogWriter(void)
{
    wcout.flush();
    wcerr.flush();
    COUT_BACKUP = wcout.rdbuf(); // save original cout buffer
    CERR_BACKUP = wcerr.rdbuf(); //save original cerr buffer
    FileStreamOpen = false;
    switch(m_nTraceLvl)
    {
    case OffLevel:
        StopOutput();
        break;
    case ErrorLevel:
        OutputErrorsToFile(s_TraceFile);
        break;
    case DetailLevel:
        OutputAllToFile(s_TraceFile);
        break;
    default:
        StopOutput();
        break;
    }
    wcout << "Initialize Log Writer" << endl;
}
void LogWriter::OutputAllToFile(TCHAR* fileName)
{
    wstreambuf* fb = GetFileBufferStream(fileName);

    wcout.rdbuf(fb); // push wcout buffer to file
    wcerr.rdbuf(fb); // push cerr buffer to file

    FileStreamOpen = true;
}
void LogWriter::OutputErrorsToFile(TCHAR* fileName)
{
    wstreambuf* fb = GetFileBufferStream(fileName);
    wcerr.rdbuf(fb);
    FileStreamOpen = true;
    wofstream fout("/dev/null");
    wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'
}
void LogWriter::StopOutput(void)
{
    wofstream fout("/dev/null");

    wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'
    wcerr.rdbuf(fout.rdbuf()); // redirect cerr to fout
}
wstreambuf* LogWriter::GetFileBufferStream(TCHAR* fileName)
{
    filestr.open(fileName);
    return filestr.rdbuf();   // get file's streambuf
}
void LogWriter::Dispose()
{
    wcout << "Kill Log Writer" << endl;
    wcout.rdbuf(COUT_BACKUP); // restore the original stream buffer
    wcerr.rdbuf(CERR_BACKUP);

    if(FileStreamOpen)
    {
        filestr.close();
    }
}

ここで、トレースをDetailLevel(2)に設定すると、すべて問題ありません。私のログはすべてファイルに送られます。しかし、OffLevelまたはErrorLevelを選択すると、プログラムがクラッシュします。デバッガーがオンにならないため、cout<<"。"を追加しました。すべての行で(私はそれをするのは嫌いですが、それは機能します)そしてそれは私を指し示します

wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'

私の犯人として...私は最初にwcoutのリダイレクトを切り替え、wcerrがリダイレクトされ、それが機能しました(ただし、wcerrはまだ呼び出されていません)

それが私の質問ですか?私は最初にwcoutを処分することになっていますか?私は最初にフラッシングを試みました..それはうまくいきませんでした..だから私は知りません。私は何が間違っているのですか?

また、ボーナスとして.. LogWriterを閉じるまで、すべての出力がファイルに送信されないのはなぜですか?IE LogWriter :: Dispose()

4

1 に答える 1

4

wofstream fout("/dev/null");はスタック上に作成され、関数を終了するとすぐに破棄されるため、クラッシュします。

「/dev/ null」は、ファイルとまったく同じように扱います。つまり、OutputErrorsToFile("/dev/null")内部を呼び出しますStopOutput()。実際、/ dev / nullも必要ありません。使用するだけwcout.rdbuf(NULL)で、より高速に動作するはずです。

ファイルに書き込むには、すぐにflushを呼び出すか、std::flushマニピュレータを使用します。

于 2013-01-15T21:57:19.113 に答える