2017-01-21 67 views
2

你有一個模擬進度完成率的lua函數,寫入stdout如何清除Lua中的stdout行?

function progress(completed) 
    io.write(completed.."\r") 
    io.flush() 
end 

progress("1% completed"); progress("50% completed") 

輸出會是

%完成了文本的

部分消失。在在類似的情況蟒蛇我可能會寫stdout以下方式之前清除行:

sys.stdout.write(' ' * 50 + '\r') 
sys.stdout.write(text + '\r') 
sys.stdout.flush() 

如何清除stdout線LUA?

我會做以下,但有一個更好或更標準的方式?

function iop(str) 
    io.write(string.format("%050s\r", ' ')) 
    io.write(str) 
    io.flush() 
end 
+2

你給正在按預期在Lua 5.3.3第一個腳本。如果第二個字符串更短,問題就會開始。 – Green

回答

1
local last_str = '' 

function iop(str) 
    io.write(('\b \b'):rep(#last_str)) -- erase old line 
    io.write(str)      -- write new line 
    io.flush() 
    last_str = str 
end 

現在讓我們來測試一下:

function wait(msec) 
    local t = os.clock() 
    repeat 
    until os.clock() > t + msec * 1e-3 
end 

iop('Very very very long string') 
wait(500) 
for i = 0, 100 do 
    iop(i..'% completed') 
    wait(20) -- wait 20 ms 
end 
print'\nDone'