如何清除命令窗口中的最后一行

时间:2012-01-11 19:59:10

标签: matlab

我很好奇正在运行的程序的进度,我打印了一些有关当前迭代的信息,例如:

for i = 1:N
    ...
    ...
    msg = sprintf('Processed %d/%d', i, N);
    display(msg)
end

我不想在单独的行上打印进度,而是希望最后一行替换上一行。我不想使用clc来清除所有内容。

我知道'\b'可以清除最后一个字符(比如退格键),我可以创建一个带有for循环的函数,该函数将项清除到前一个新行之前。但是有更好的方法吗?如果没有,我如何检查命令行中的最后一个字符是否是新行?

5 个答案:

答案 0 :(得分:31)

我刚才看过这个问题。而且我注意到字符\r(用于擦除最后一行)在命令行(-nodesktop)中使用matlab,但不适用于图形模式...

我找到的最佳解决方案是做类似的事情:

n=0;
for ...
  ...
  fprintf(repmat('\b',1,n));
  fprintf(msg);
  n=numel(msg);
end

答案 1 :(得分:18)

Yair Altmana very nice example on his blog如何使用退格控制字符(\b)来执行您想要的操作,但比您考虑的更容易。修改你的代码就像他的例子一样,你可以这样做:

reverseStr = '';
for i = 1:N
    ...
    ...
    msg = sprintf('Processed %d/%d', i, N);
    fprintf([reverseStr, msg]);
    reverseStr = repmat(sprintf('\b'), 1, length(msg));
end

答案 2 :(得分:3)

我为此目的使用'dispstat'功能。它可以更新以前的输出,这是默认'disp'的缺失功能。使用非常简单。可以从这里下载:http://www.mathworks.com/matlabcentral/fileexchange/44673-overwritable-message-outputs-to-commandline-window

***样本用法:

 dispstat('','init'); % One time only initialization
 dispstat(sprintf('Begining the process...'),'keepthis','timestamp');
 for i = 97:100
     dispstat(sprintf('Progress %d%%',i),'timestamp');
     %doing some heavy stuff here
 end
 dispstat('Finished.','keepprev');

***输出:

11:25:37 Begining the process...
11:25:37 Progress 100%
Finished.

一切顺利

答案 3 :(得分:2)

这是关于你要找的东西

%# create title
fprintf('processed: %03d',0)
for i=1:10
    %# delete last three digit number and replace with new
    %# loop index
    fprintf('\b\b\b\b %03d',i);

    %# process here
    pause(.5)
end
%# clear line
fprintf('\n');

但如果您的代码显示其他结果,则无效。您可能需要考虑使用消息框来更新进度。

答案 4 :(得分:0)

覆盖整个前一行的另一种解决方案依赖于 \r 格式字符,

ctrl=0;
while ctrl<5
    fprintf('\rctrl: %i',ctrl);
    ctrl=ctrl+1;
    pause(2); % To highlight overwrite 
end
fprintf('\n'); % Don't forget the newline