39

我在 Octave 中有一个程序,它有一个循环——运行一个带有各种参数的函数,而不是我可以变成矩阵的东西。在每次迭代开始时,我使用 打印当前参数disp

第一次运行它时,我收到了无数条警告,然后我也收到了这些打印件。现在我把它们清理干净了,我再也看不到它们了。我的猜测是它们被困在缓冲区中,当程序结束或缓冲区填满时我会看到它们。

有什么方法可以强制刷新打印缓冲区以便我可以看到我的打印件?

4

7 回答 7

45

使用 fflush(stdout) 和/或 fflush(stderr) 从 disp() 刷新缓冲区。

于 2010-04-14T07:47:29.493 回答
30

正如 moastab 所提到的,fflush(stdout)适用于 Octave。

在 MATLAB 中,用于drawnow('update')刷新输出。

MATLAB 的drawnow功能对于那些在 MATLAB 中控制图形对象重绘的人来说很熟悉,但它也适用于 stdout 标准错误缓冲区。该'update'选项不是必需的,但会将刷新限制为非图形队列。这个细节仅仅暗示在drawow() 文档中;我已经验证它可以循环处理 fprintf 调用。

于 2011-11-19T00:39:32.113 回答
20

Octave:您可以通过调用来关闭输出缓冲more off

这将禁用分页,以便所有输出都直接发送到屏幕。

于 2012-02-02T12:21:17.033 回答
7

将以下命令放在您的部分或代码的开头:

page_screen_output(0);

page_output_immediately(1);
于 2015-07-21T14:24:00.473 回答
3

如果我正确理解您的问题,您可以使用日记功能将所有会话输出转储到文本文件中。diary on将开始录制,diary off并将停止。diary filename将使用文件名而不是默认的“日记”。

它是 Octave 和 MATLAB 中的内置函数。有关更多详细信息,请参阅help diary


您也可以增加 Octave 缓冲区大小。在 Windows 上,您可以在 Octave Properties 对话框的左上角菜单中执行此操作。

于 2010-04-13T20:44:31.870 回答
0

drawnow将导致图表更新,我不确定它是否也适用于stdout管道。

您也可以将您的disp(...)语句转换为fprintf(stderr, ...),我认为stderr它的处理方式与stdoutOctave 不同。

于 2010-04-13T20:50:34.630 回答
0

这里和其他地方,至少有 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
于 2019-03-20T14:15:22.037 回答