Почему перенаправление wcout / wcerr в / dev / null приводит к сбою программы?

рассмотреть мой класс регистрации

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();
}
}

Теперь, если я установлю свой Tracing в DetailLevel (2), все в порядке. Все мои записи идут в файл. Но если я выбираю OffLevel или ErrorLevel, моя программа падает. Мой отладчик не включается, поэтому я добавил cout << «» на каждой строке (я ненавижу это делать, но это работает), и это указывает мне на

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

как мой виновник … я переключился с перенаправления wcout сначала с перенаправлением wcerr, и это сработало (но wcerr еще не вызывался)

так это мой вопрос? я должен избавиться от wcout первым? Сначала я попытался промыть .. это не сработало … так что я не знаю. Что я делаю неправильно?

Кроме того, в качестве бонуса … почему все мои данные не попадают в файл, пока я не закрою свой LogWriter? IE LogWriter :: Dispose ()

0

Решение

Вы терпите крах, потому что wofstream fout("/dev/null"); создается в стеке и уничтожается, как только вы выходите из функции.

Обрабатывайте «/ dev / null» точно так же, как вы относитесь к файлу. То есть звоните OutputErrorsToFile("/dev/null") внутри StopOutput(), На самом деле вам даже не нужен / dev / null, просто используйте wcout.rdbuf(NULL), тоже должен работать быстрее.

Для записи в файл немедленно вызовите flush или используйте манипулятор std :: flush.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]