我在Matlab中有很多I / O函数可以编写和读取相当大的文件。我喜欢干净的进度报告,当它们正在运行并且它们经常运行时,我自然不想在控制台上发送垃圾邮件。这里有another answer这个问题有一个优雅的解决方案(尽管Matlab没有内置函数可以做到这一点,这真是太可惜了!)。
但是,这仍然会给我的代码带来很多混乱。如果我的函数将5个大的东西输出到一个文件中,并且我想要一个关于所有这些文件的自定义进度报告,那么这至少有25行额外代码大致相似。因此将这些包装成一个简单的函数是很自然的。我试过这个,但当它被包裹在一个函数中时,反转字符串中的反斜杠字符似乎被忽略了。为什么是这样?下面是一个简单的测试用例,您可以复制粘贴。
function test()
%Example formatted string: a single decimal.
str='%d ';
reverseStr='';
%Rewriting a console line explicitly
disp('Case 1:');
for j=1:10
msg = sprintf(str, j);
fprintf([reverseStr, msg]);
reverseStr = repmat(sprintf('\b'), 1, length(msg));
pause(0.5)
end
fprintf('\n');
%Try doing the same thing wrapped within a function.
disp('Case 2:');
for j=1:10
reportToConsole(str,j)
pause(0.5)
end
fprintf('\n');
end
function reportToConsole(str, varargin)
reverseStr='';
msg = sprintf(str, varargin{:});
fprintf([reverseStr, msg]);
reverseStr = repmat(sprintf('\b'), 1, length(msg));
pause(0.5)
end
修改
我想我发现了这个问题。事实上reverseStr
没有得到正确的长度,因为它取决于脚本运行多次。用简单的reportToConsole()
替换fprintf(...); clc;
似乎不起作用。打印邮件后也没有定义reverseStr
,因为它会立即被删除。添加pause
会非常不优雅,因为这会减慢一切。
答案 0 :(得分:0)
您在案例2的每次循环迭代中重置reverseStr
的值。
请尝试使用此功能:
function test()
str='%d ';
reverseStr='';
for j=1:10
reverseStr = reportToConsole(str,j, reverseStr);
pause(0.1)
end
fprintf('\n');
end
function reverseStr = reportToConsole(str, j, reverseStr)
msg = sprintf(str, j);
fprintf('%s', [reverseStr, msg]);
reverseStr = repmat(sprintf('\b'), 1, length(msg));
pause(0.1)
end