本文中,我們來寫一個進度條。
本文大綱:
寫一個命令行版的進度條。
1.回車換行
2.緩沖區問題(本文不深究)
? 2.1測試代碼
3.寫一個什么樣的進度條?
? version1
? version2
回車換行
這倆不是一個概念:
在計算機語言中,換行是\n,回車是\r。\n\r是回車換行。
如果改成這樣:
我們就會發現,等待3秒后才會打印出來。
那么,先執行的是printf,還是sleep呢?
我們的程序永遠都是從前往后執行的。
為什么printf執行完了顯示器沒有顯示?在我們休眠的時間里,我們的字符串在哪?
在緩存區里。
那為什么有’\n’,就能先打印出來呢?
因為行刷新。
而我們沒有’\n’,是因為程序結束了會自動刷新緩沖區。
如果我們想讓不帶’\n’的自動刷新呢?
fflush
我們的程序會自動打開這三個流。
stdin是鍵盤。stdout和stderr是顯示器。
我們知道,linux下一切皆文件,printf是往stdout里寫入。
所以我們也可以加一個參數,然后寫成fprintf版本:
使用fflush:
測試代碼:
如果我們想在同一個位置打印呢?那就不能讓它換行了。
光標的位置永遠是輸入下一個字符的位置。
所以我們這樣修改:
這里,如果我們把i定義為10,就會發現:
倒計時到1的時候顯示的是:
理解顯示
當我們在屏幕上打印12345時,打印的是整數12345,還是字符’1’‘2’‘3’‘4’'5’呢?
答案是后者。
**顯示器只認字符!**所以我們說,顯示器是字符設備。
這也是為什么平時printf時,要格式化輸出。
比如我們int a;
,printf內部把我們的a由整數轉成字符串,然后再由類似putc這樣的接口把字符一個個顯示出來。
我們這樣修改:
怎么理解這個%2d呢?
這代表位寬為2,一次顯示兩個字符,如果只有一個字符,會把后面的字符清理掉,可以理解為顯示的是02或者空格2.
我們還可以改成,讓數字靠屏幕左側顯示:
這樣修改,表示左對齊。
寫一個什么樣的進度條?
左側的這個中括號里面,隨著右側中括號里的百分比增加,井號增加(但不會講右側中括號向后擠),同時最右側的中括號中/進行旋轉。
原理版本(version1)
用sleep會太慢了,所以我們改用usleep:
微秒
1s=100w微秒
我們可以先寫出井號部分的中括號:
然后再寫出百分比的中括號:
旋轉光標
我們將這4個字符覆蓋式地顯示:| / - \\
,就可以得到我們想要的效果。
\\
是因為要取字面值,才能得到我們想要的\
然后我們可以比較巧妙地這樣來顯示:
這個進度條可以跑了,但是沒法使用。
如果未來我們是在下載東西的時候打印進度條:
這樣進度條的進度與我們的下載進度不符。
真實版本
應該是邊下載邊更新。
所以我們接下來把process.h改成:
然后我們再來寫process.c
然后會看到報錯:
所以我們要這樣:
然后我們就可以得到:
然后我們發現沒到100,需要改一下這里:
最后修改
我們最后將其改為回調函數形式的,更好:
Thanks?(・ω・)ノ