我在 Octave 中有一个程序,它有一个循环——运行一个带有各种参数的函数,而不是我可以变成矩阵的东西。在每次迭代开始时,我使用 打印当前参数disp
。
第一次运行它时,我收到了无数条警告,然后我也收到了这些打印件。现在我把它们清理干净了,我再也看不到它们了。我的猜测是它们被困在缓冲区中,当程序结束或缓冲区填满时我会看到它们。
有什么方法可以强制刷新打印缓冲区以便我可以看到我的打印件?
使用 fflush(stdout) 和/或 fflush(stderr) 从 disp() 刷新缓冲区。
正如 moastab 所提到的,fflush(stdout)
适用于 Octave。
在 MATLAB 中,用于drawnow('update')
刷新输出。
MATLAB 的drawnow
功能对于那些在 MATLAB 中控制图形对象重绘的人来说很熟悉,但它也适用于 stdout 标准错误缓冲区。该'update'
选项不是必需的,但会将刷新限制为非图形队列。这个细节仅仅暗示在drawow() 文档中;我已经验证它可以循环处理 fprintf 调用。
Octave:您可以通过调用来关闭输出缓冲more off
。
这将禁用分页,以便所有输出都直接发送到屏幕。
将以下命令放在您的部分或代码的开头:
page_screen_output(0);
page_output_immediately(1);
如果我正确理解您的问题,您可以使用日记功能将所有会话输出转储到文本文件中。diary on
将开始录制,diary off
并将停止。diary filename
将使用文件名而不是默认的“日记”。
它是 Octave 和 MATLAB 中的内置函数。有关更多详细信息,请参阅help diary
。
您也可以增加 Octave 缓冲区大小。在 Windows 上,您可以在 Octave Properties 对话框的左上角菜单中执行此操作。
drawnow
将导致图表更新,我不确定它是否也适用于stdout
管道。
您也可以将您的disp(...)
语句转换为fprintf(stderr, ...)
,我认为stderr
它的处理方式与stdout
Octave 不同。
从这里和其他地方,至少有 5 种方法可以在Octave中获得即时输出。
使用以下方法之一:
%---------------------------
% 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