我在Octave中有一个程序有一个循环 - 运行一个带有各种参数的函数,而不是我可以变成矩阵的东西。在每次迭代开始时,我使用disp
打印当前参数。
我第一次运行它有一个brazillion警告,然后我也得到了这些打印。现在我清理了它们,我不再看到它们了。我的猜测是他们被困在缓冲区中,当程序结束或缓冲区填满时我会看到它们。
有没有办法强制刷新打印缓冲区,以便我可以看到我的打印件?
使用fflush(stdout)和/或fflush(stderr)从disp()刷新缓冲区。
如moastab所述,fflush(stdout)
适用于Octave。
在MATLAB中,使用drawnow('update')
刷新输出。
对于在MATLAB中控制重绘图形对象的人来说,MATLAB的drawnow
函数会很熟悉,但它也适用于stdout stderr缓冲区。 'update'
选项不是必需的,但会将刷新限制为非图形队列。这个细节仅仅隐含在drawnow() documentation中;我已经验证它可以在循环中处理fprintf调用。
八度:您可以通过调用more off
来关闭输出缓冲。
这将禁用分页,以便将所有输出直接发送到屏幕。
将以下命令放在您的部分或代码的开头:
page_screen_output(0);
page_output_immediately(1);
如果我正确理解您的问题,您可以使用日记功能将所有会话输出转储到文本文件。 diary on
将开始录制,diary off
将停止。 diary filename
将使用文件名而不是默认的“日记”。
它是Octave和MATLAB中的build -in函数。有关更多详细信息,请参阅help diary
。
您还可以增加Octave缓冲区大小。在Windows上,您可以从左上角菜单的“八度属性”对话框中执行此操作。
drawnow
将导致图表更新,我不确定它是否也适用于stdout
管道。
您也可以将disp(...)
语句转换为fprintf(stderr, ...)
,我认为stderr
的处理方式与Octave上的stdout
不同。
从here和其他地方来看,在Octave中至少有5种方法可以立即获得输出。
使用以下之一:
%---------------------------
% Turn OFF output buffering
%---------------------------
more off % command & NOT shown in output
PAGER = "less" % built-in var - shown in output
page_screen_output = 0 % built-in var - shown in output
page_output_immediately = 1 % built-in var - shown in output
fflush(stdout) % Need to call after each "output" line