如何将控制台行重写为一个简单的函数

时间:2015-11-10 13:12:22

标签: matlab

我在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

跑步'测试'输出到:
enter image description here

修改
我想我发现了这个问题。事实上reverseStr没有得到正确的长度,因为它取决于脚本运行多次。用简单的reportToConsole()替换fprintf(...); clc;似乎不起作用。打印邮件后也没有定义reverseStr,因为它会立即被删除。添加pause会非常不优雅,因为这会减慢一切。

1 个答案:

答案 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