1

我们构建了复杂的基于控制台的工具,这些工具在控制台上产生了大量的评论。这些工具处理大量数据,因此运行成本高昂,我们不希望过于频繁地执行它们,尤其是在我们已经必须重复运行它们的测试期间。在此类测试中,我们经常将结果记录到一个文件中以捕获此注释以供检查: C:> [ourcommand] >log.txt 当应用程序运行到完成时,这非常有效。

如果应用程序崩溃(非法内存引用等),Windows 会在评论结尾之前讨厌地切断日志文件,因此我们无法看到崩溃时发生的情况。它还会在同一位置切断控制台输出。因此,当我们得到一个截断的日志文件时,我们必须在没有日志文件的情况下再次执行所有操作,才能看到最终答案。如果不记录,Windows 似乎不会缓冲控制台输出。

有没有办法告诉 Windows 在记录时不要缓冲控制台输出?我们的应用程序确实使用(Windows)C 运行时系统,不久前我们使用了“setvbuf”,如下所示: setvbuf(stdout, NULL, _IONBF, 0); 但无济于事。

4

3 回答 3

2

您可以随时刷新控制台的缓冲区:

Console.Out.Flush();

这使用TextWriter.Flush()

如果您需要确保这种情况总是发生,那么为控制台编写一个与 WriteLine 类似但在末尾包含一个刷新语句的方法会相当容易。


编辑:

您没有指定语言...我将使用 C# 编写一个示例。

在 C# 中,您可以轻松地创建一个提供如下方法的静态实用程序类:

public static class FlushingConsole {
    public static void WriteLine(string format, params Object[] args) {
        Console.WriteLine(format, args);
        Console.Out.Flush();
    }
    // Add other overloads as required
}

然后只需调用:

FlushingConsole.WriteLine(....);

同样的方法也应该适用于几乎任何其他语言。


编辑2:

由于您使用的是 C++,因此除了 setvbuf 之外,还有几个可能感兴趣的选项。

首先,您应该能够通过执行以下操作关闭 cout 中的缓冲:

cout.unsetf(ios_base::unitbuf);

sync_with_stdio如果您将 stdio(即:printf)与 iostreams 混合,您可能还需要设置。

于 2009-07-03T16:48:40.303 回答
1

您没有指定语言,但对于 C++,您应该能够调用setvbuf并将 stdout 作为第一个参数来关闭缓冲。

于 2009-07-03T16:50:22.737 回答
1

您似乎正在使用标准输出。你最好使用“标准错误”。(C 库中的 stderr,iostreams 中的 cerr)那些没有缓冲。或者,您可以在每次希望同步时使用 FlushFileBuffers(或模拟)。

于 2009-07-03T16:50:50.943 回答