1

我正在重定向stderr到 Windows Phone 运行时的日志文件:

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一切似乎都工作正常。

4

1 回答 1

2

是窗户,谁知道呢?

尝试一下std::cerr.flush();,因为我完全可以看到窗口再次做自己的事情(就像套接字不像文件,他们喜欢做自己的 IO 事情)。

使用我上面所说的将任务放到他们的标准库中,而不是假设它是一个文件等。记住“抽象”,它是有意义的,flush是一种方法,它是一个动词,我们不在乎如何(或者在这种情况下不(想要)知道)所以让我们假设flush做了flush应该做的事情!

如果这不起作用,请发表评论,我会考虑一下。

我不使用 Windows 或 Windows 手机(我不是世界上幸运的 24 人之一:P),但我知道 Windows 上存在 I/O 问题(“差异”),幸运的是 MinGW 和共同隐藏他们来自我:)

或者

改变你的策略,如果我真的想回避问题(因为它不是你的代码)创建一个名为 my_error_stream 或其他东西的新类,它扩展了 std::ostream (这样你就可以像 std::cerr 一样使用它其中“是”std::ostream)。

将静态方法放入名为 get_error_stream() 或返回从 my_error_stream 派生的两个类之一中的静态方法,一个转发到 std::err,另一个转发到文件。

这取决于你喜欢你的代码的外观和感觉,我这样说是因为它使实现保持独立,并在它们自己的类层次结构的“分支”下。

它并没有真正回答你的问题,但你的代码看起来不错,而且 Windows 很讨厌管道和套接字。

于 2013-10-08T21:37:28.760 回答