我在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
沒有得到正確的長度,因爲它取決於多次運行的腳本。用簡單的fprintf(...); clc;
代替reportToConsole()
似乎不起作用。在打印消息後定義reverseStr
也不會立即刪除。添加一個pause
將是非常不雅觀的,因爲這會減慢一切。
這工作得很好,但使用字符串''%d %% \ n'使函數在每次迭代中刪除一個字符太多。它應該實際顯示百分比符號。 –
@PatronBernard問題也存在於循環解決方案中。這是你的'fprintf'調用的問題。我已經更新了我的答案。 – excaza
它的工作原理!謝謝。我仍然希望Mathworks將這個內置函數作爲內建函數,所以我們不需要任何外部變量。 –