fflush на stderrr вызывает сбой программы

0

Я перенаправляю stderr в файл журнала в Windows Phone Runtime:

int stdError = 0;
FILE* pLogFile = NULL;

// Redirect stderror to a logfile
if ( ! m_logFilePath.empty( ) )
{
    // Get a duplicate file descriptor for stderror
    // This returns -1 on failure
    stdError = ::_dup( ::_fileno( stderr ) );

    if ( stdError != -1 )
    {
        // Redirect stderror to a log file so we can capture
        // ffmpeg error information
        // Ignore the return value (nothing we can do if this fails)
        ::freopen_s( &pLogFile, m_logFilePath.c_str( ), "w", stderr );
    }
}

Программа прерывается при вызове fflush(stderr); , Когда я не перенаправляю stderr все, кажется, работает нормально.

Теги:
stderr
fflush
windows-phone-8

1 ответ

1
Лучший ответ

Это окна, кто знает?

Попробуйте std::cerr.flush(); потому что я могу полностью видеть окна, делающие свою собственную вещь снова (например, сокеты не похожи на файлы, им нравится делать свои собственные записи IO).

Используя то, что я только что сказал выше, ставит задачу в свою стандартную библиотеку, вместо того, чтобы считать ее файлом и т.д. Помните "абстракцию", это означает, что флеш-метод - это метод, это глагол, и нам все равно, как (или в этом случае не хотите (хотите) знать), поэтому давайте просто предположим, что флеш делает то, что нужно делать !

Оставьте комментарий, если это не сработает, и я подумаю.

Я не использую Windows или Windows-телефоны (я не один из счастливчиков 24 в мире: P), но я знаю, что есть проблемы с I/O ("различия") в Windows, к счастью, MinGW и co hide их от меня :)

ИЛИ

Измените свою тактику, если мне действительно захотелось решить проблему (потому что это не ваш код) создать новый класс с именем my_error_stream или что-то еще, что расширяет std :: ostream (таким образом вы можете использовать его как std :: cerr который "является" std :: ostream ").

Поместите статический метод в вызываемый get_error_stream() или что-то, что возвращает один из двух классов, полученных из my_error_stream, один направляет прямо в std :: err, а другой - в файл.

Это зависит от того, как вам нравится ваш код выглядеть и чувствовать, я сказал так, потому что он сохраняет реализации отдельно и под их собственной "ветвью" иерархии классов.

Это на самом деле не отвечает на ваш вопрос, но ваш код кажется прекрасным, а Windows отсасывает трубы и сокеты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню