前言
在linux環境下,c語言的輸入輸出控制有其獨特的魅力和實際應用場景。本文將從回車換行和緩沖區的基礎知識講起,帶領大家探索如何在linux環境中實現一個動態倒計時功能,并進一步完成一個具有交互感的進度條。通過這些內容,你不僅可以理解c語言在linux中的輸出行為,還能掌握如何通過代碼提升程序的可視化表現。無論是Linux開發初學者,還是想深入了解c語言底層實現的同學,這篇文章都將為你帶來新的啟發。
?一、預備知識?1.1 回車換行
真正意義上,回車換行其實是兩個動作,在c語言中 卻同時完成了回車+換行的兩步動作。
回車:將光標移到當前行的最左側換行:將光標移到當前行對應位置的下一行
在C語言中可以使用轉義字符 來實現單獨的回車行為。
如圖展示以下以前的老式鍵盤:

這種電腦鍵盤上的ENTER按鍵就是同時實現了回車和換行的功能,按下ENTER鍵,光標會去到下一行的最左側的位置。
?1.2 緩沖區
先看一段代碼
代碼語言:JavaScript代碼運行次數:0運行復制
這段代碼很簡單,現在屏幕上打印出hello world,接著調用sleep函數讓程序休眠兩秒,

間隔兩秒后。

接下來,我們對上面的代碼稍作修改,去掉 再來試試。
代碼語言:javascript代碼運行次數:0運行復制
#include <unistd.h>int main() { printf("hello world"); sleep(2); return 0;}</unistd.h>
在去掉/n后對代碼編譯運行,先是休眠了兩秒,

接著才在屏幕上打印出hello world,并且因為沒有 ,所以打印完后沒有換行,導致命令行提示符就緊跟在打印結果的后面。

情景分析
那么問題來了,這段代碼是先執行sleep,還是先執行printf打印呢?
很多人會根據上面的現象猜測,這段代碼先執行了sleep休眠,再去執行printf打印,這樣的猜測是錯誤的!因為任何一個C語言程序,都是嚴格按照代碼的編寫順序去執行的。
那在休眠的兩秒期間,printf的打印結果存在哪里了呢?
hello world其實是保存在了緩沖區中,緩沖區是用于臨時存儲數據的內存空間,默認當程序結束的時候才會將緩沖區中的內容刷新出來。
如何強制刷新緩沖區
任何一個C語言程序運行的時候都會默認幫我們打開以下三個流:
stdin – – – – 標準輸入流(鍵盤)stdout – – – – 標準輸出流(顯示器)stderr – – – – 標準錯誤(顯示器)

Linux下一切皆文件,這三個流都是FILE*的指針,所以任何一個C語言程序運行的時候,操作系統會幫我們打開以上三個文件。今天我們只需要關心stdout標準輸出流即可。我們可以通過fflush函數來刷新緩沖區。
代碼語言:javascript代碼運行次數:0運行復制
#include <stdio.h>#include <unistd.h>int main(){ printf("hello world"); fflush(stdout); sleep(2); return 0;}</unistd.h></stdio.h>

等待兩秒后…

通過上面的分析我們可以得出,刷新緩沖區主要有以下幾種方法:
可以刷新緩沖區。程序結束也會刷新緩沖區。fflush(stdout)可以手動刷新緩沖區。?二、倒計時
學習了上面的東西,我們可以先來實現一個簡單的倒計時練練手
?2.1 源代碼代碼語言:javascript代碼運行次數:0運行復制
#include "processBar.h"#include <unistd.h>int main(){int cnt = 10;while(cnt >= 0){printf("%-2d ",cnt);fflush(stdout);sleep(1);cnt--;}printf(" "); return 0;}</unistd.h>
?2.2 效果展示
從 10 開始計數

直到變成 0 為止。
?2.3 注意事項: 每打印一個數字后緊跟著打印一個 回車,讓光標回到這一行最開始的位置,這樣新打印的數字就會去覆蓋掉老的數字。但是 不會去刷新緩沖區,因此在每打印完一個數字后,需要調用fflush(stdout)來刷新緩沖區。 這里我們需要知道,往顯示器上打印整型10,本質上是打印了字符1和字符0,由于這兩個字符是挨在一起的,我們看起來就像是整型10。因此打印10,會占用兩個字符,而打印0~9只需要一個字符,所以 回車之后去覆蓋寫,只會覆蓋一個字符,對第二個字符0始終沒有影響,因此我們需要用%-2d來控制,每次打印兩個位寬的字符,-表示將這兩個字符左對齊。如果不進行格式化控制,打印出來的結果將是下面這樣:

?三、進度條?3.1 源代碼?processBar.h代碼語言:javascript代碼運行次數:0運行復制
#pragma once#include <stdio.h>#define NUM 102#define STYLE '=' #define TOP 100#define BODY '$'extern void processbar();</stdio.h>
?processBar.c代碼語言:javascript代碼運行次數:0運行復制
#include "processBar.h"#include <string.h>#include <unistd.h>const char* lable = "|/-";//旋轉提示void processbar(){ char bar[NUM]; memset(bar, ' 主站蜘蛛池模板: 日韩午夜精品 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 国产中的精品av涩差av | 午夜精品影院 | 亚洲国产精品人人爽夜夜爽 | 亚洲高清在线免费观看 | 久久国产精品视频 | 欧美另类视频 | 日韩视频国产 | 九九九久久国产免费 | m豆传媒在线链接观看 | 欧美成人h版在线观看 | 我爱操| 国产日韩欧美激情 | 久久久精品一区 | 国产欧美久久一区二区三区 | 精品国产精品三级精品av网址 | 国产精品国产a级 | 羞羞的视频免费看 | 中文字幕亚洲一区二区三区 | 91精品国产综合久久久久久漫画 | 国产美女在线免费观看 | 日韩精品在线一区二区 | 成人小视频在线观看 | 中文一区 | 日美女逼逼 | 欧美精品1区2区3区 免费黄篇 | 国产精品免费播放 | 精品久久网| 久久久久久看片 | www.亚洲 | 中文字幕在线不卡 | 午夜大片 | 久久亚洲视频网 | 欧美不卡在线 | 国产精品区二区三区日本 | 亚洲一区在线日韩在线深爱 | 欧美日韩一区二区三区四区五区 | 欧美涩| 国产精品不卡一区 | 毛片免费在线 |