前言
在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, ' 主站蜘蛛池模板: 免费又黄又爽视频 | 殴美毛片| 久草在线新视觉 | 91精品久久| 久久综合香蕉久久久久久久 | 久久亚洲精品中文字幕亚瑟 | 三级网站免费看 | 国产成人午夜片在线观看 | 日本精品久久久久中文字幕 1 | 亚洲人在线播放 | 九九精品免视看国产成人 | 亚洲免费成人在线 | 风流慈禧一级毛片在线播放 | 久久综合色88 | 亚洲毛片免费视频 | 欧美特级午夜一区二区三区 | 在线第一页 | 91久久香蕉国产线看 | 国产原创在线视频 | 性生大片一级毛片免费观看 | 精品日韩欧美一区二区三区在线播放 | 欧美高清视频一区 | 亚洲精品国产一区二区图片欧美 | 99在线热视频只有精品免费 | a级毛片免费观看网站 | 亚洲免费网| 国产在线视频专区 | 日本综合欧美一区二区三区 | a级国产精品片在线观看 | 欧美一级特黄aa大片 | 国产精品99久久久 | 美女又黄又免费视频 | 一区二区三区在线 | 欧 | 手机国产日韩高清免费看片 | 视频一区二区三区自拍 | 日本人的色道www免费一区 | 久久爽久久爽久久免费观看 | 色在线免费视频 | 日韩色综合 | 国产精品女上位在线观看 | 久久精品国产一区二区三区日韩 |