我们构建了复杂的基于控制台的工具,可以在控制台上产生大量的评论。这些工具处理大量数据,因此运行成本很高,我们不喜欢经常这样做,特别是在我们必须重复运行它们的测试期间。在此类测试期间,我们经常将结果记录到文件中以捕获此注释以供检查: C:> [ourcommand]> log.txt 当应用程序运行完成时,这很有效。
如果应用程序崩溃(非法内存引用等),Windows会在评论的尾部之前删除日志文件,这样我们就无法看到崩溃时发生了什么。它还在同一个地方插入控制台输出。因此,当我们得到截断的日志文件时,我们必须在没有日志文件的情况下再次完成所有操作,以查看最终答案。如果不记录,Windows似乎不会缓冲控制台输出。
有没有办法告诉Windows在登录时不要缓冲控制台输出?我们的应用程序确实使用了(Windows)C运行时系统,不久之前我们使用了“setvbuf” 如下: setvbuf(stdout,NULL,_IONBF,0); 但无济于事。
答案 0 :(得分:2)
您可以随时刷新控制台的缓冲区:
Console.Out.Flush();
如果你需要确保这种情况总是发生,那么编写一个像WriteLine一样工作的控制台的方法会很容易,但最后会包含一个flush语句。
编辑:
你没有指定语言......我打算用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);
如果你将stdio(即:printf)与iostream混合,你也可能需要设置sync_with_stdio
。
答案 1 :(得分:0)
您没有指定语言,但对于C ++,您应该能够使用stdout作为第一个关闭缓冲的参数来调用setvbuf。
答案 2 :(得分:0)
您似乎正在使用标准输出。你最好使用“标准错误”。 (C库中的stderr,iostream中的cerr)这些都没有缓冲。或者,每次要同步时,都可以使用FlushFileBuffers(或模拟)。