2015-11-10 25 views
1

我在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沒有得到正確的長度,因爲它取決於多次運行的腳本。用簡單的fprintf(...); clc;代替reportToConsole()似乎不起作用。在打印消息後定義reverseStr也不會立即刪除。添加一個pause將是非常不雅觀的,因爲這會減慢一切。

回答

0

你在每次循環復位的reverseStr值的情況下,2

試試這個函數:

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 
+0

這工作得很好,但使用字符串''%d %% \ n'使函數在每次迭代中刪除一個字符太多。它應該實際顯示百分比符號。 –

+0

@PatronBernard問題也存在於循環解決方案中。這是你的'fprintf'調用的問題。我已經更新了我的答案。 – excaza

+0

它的工作原理!謝謝。我仍然希望Mathworks將這個內置函數作爲內建函數,所以我們不需要任何外部變量。 –