Я перенаправляю 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
Кажется, все работает нормально.
Это окна, так что, кто знает?
Пытаться std::cerr.flush();
потому что я могу видеть, что окна снова делают свое дело (например, сокеты не похожи на файлы, им нравится делать свои собственные операции ввода-вывода).
Использование того, что я только что сказал выше, ставит задачу в их стандартную библиотеку, а не предполагает, что это файл и тому подобное. Запомните «абстракцию», имеет смысл, что flush — это метод, это глагол, и нам все равно, как (или в этом случае не (хотеть) знать)), поэтому давайте просто предположим, что flush делает то, что должен делать flush !
Оставьте комментарий, если это не сработает, и я подумаю.
Я не использую Windows или Windows Phone (я не один из счастливчиков 24 в мире: P), но я знаю, что в Windows есть проблемы с вводом / выводом («различия»), к счастью, MinGW и co hide их от меня 🙂
ИЛИ ЖЕ
Измените свою тактику, если я действительно хотел обойти проблему (потому что это не ваш код), создать новый класс с именем my_error_stream или чем-то еще, который расширяет std :: ostream (таким образом, вы можете использовать его как std :: cerr который «является» std :: ostream).
Поместите статический метод в метод get_error_stream () или что-то, что возвращает один из двух классов, производных от my_error_stream, один перенаправляет право на std :: err, другой в файл.
Это зависит от того, как вы хотите, чтобы ваш код выглядел и чувствовал, я сказал так, потому что он поддерживает реализации отдельно и под собственной «ветвью» иерархии классов.
Это на самом деле не отвечает на ваш вопрос, но ваш код кажется нормальным, и Windows отстой в каналах и сокетах.
Других решений пока нет …