九色91_成人精品一区二区三区中文字幕_国产精品久久久久一区二区三区_欧美精品久久_国产精品99久久久久久久vr_www.国产视频

Hello! 歡迎來到小浪云!


基于Linux環境的進度條實現


avatar
小浪云 2025-04-18 18

前言

linux環境下,c語言的輸入輸出控制有其獨特的魅力和實際應用場景。本文將從回車換行和緩沖區的基礎知識講起,帶領大家探索如何在linux環境中實現一個動態倒計時功能,并進一步完成一個具有交互感的進度條。通過這些內容,你不僅可以理解c語言linux中的輸出行為,還能掌握如何通過代碼提升程序的可視化表現。無論是Linux開發初學者,還是想深入了解c語言底層實現的同學,這篇文章都將為你帶來新的啟發。

?一、預備知識?1.1 回車換行

真正意義上,回車換行其實是兩個動作,在c語言中 卻同時完成了回車+換行的兩步動作。

回車:將光標移到當前行的最左側換行:將光標移到當前行對應位置的下一行

在C語言中可以使用轉義字符 來實現單獨的回車行為。

如圖展示以下以前的老式鍵盤:

基于Linux環境的進度條實現

這種電腦鍵盤上的ENTER按鍵就是同時實現了回車和換行的功能,按下ENTER鍵,光標會去到下一行的最左側的位置。

?1.2 緩沖區

先看一段代碼

代碼語言:JavaScript代碼運行次數:0運行復制

#include <unistd.h>int main() {     printf("hello world ");                                                    sleep(2);     return 0;}</unistd.h>

這段代碼很簡單,現在屏幕上打印出hello world,接著調用sleep函數讓程序休眠兩秒,

基于Linux環境的進度條實現

間隔兩秒后。

基于Linux環境的進度條實現

接下來,我們對上面的代碼稍作修改,去掉 再來試試。

代碼語言:javascript代碼運行次數:0運行復制

#include <unistd.h>int main() {     printf("hello world");                                       sleep(2);     return 0;}</unistd.h>

在去掉/n后對代碼編譯運行,先是休眠了兩秒,

基于Linux環境的進度條實現

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

基于Linux環境的進度條實現

情景分析

那么問題來了,這段代碼是先執行sleep,還是先執行printf打印呢?

很多人會根據上面的現象猜測,這段代碼先執行了sleep休眠,再去執行printf打印,這樣的猜測是錯誤的!因為任何一個C語言程序,都是嚴格按照代碼的編寫順序去執行的。

那在休眠的兩秒期間,printf的打印結果存在哪里了呢?

hello world其實是保存在了緩沖區中,緩沖區是用于臨時存儲數據的內存空間,默認當程序結束的時候才會將緩沖區中的內容刷新出來。

如何強制刷新緩沖區

任何一個C語言程序運行的時候都會默認幫我們打開以下三個流:

stdin – – – – 標準輸入流(鍵盤)stdout – – – – 標準輸出流(顯示器)stderr – – – – 標準錯誤(顯示器)

基于Linux環境的進度條實現

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>
基于Linux環境的進度條實現

等待兩秒后…

基于Linux環境的進度條實現

通過上面的分析我們可以得出,刷新緩沖區主要有以下幾種方法:

可以刷新緩沖區。程序結束也會刷新緩沖區。fflush(stdout)可以手動刷新緩沖區。?二、倒計時

學習了上面的東西,我們可以先來實現一個簡單的倒計時練練手

?2.1 源代碼代碼語言:javascript代碼運行次數:0運行復制

#include "processBar.h"#include <unistd.h>int main(){int cnt = 10;while(cnt &gt;= 0){printf("%-2d ",cnt);fflush(stdout);sleep(1);cnt--;}printf(" ");                                                           return 0;}</unistd.h>

?2.2 效果展示

從 10 開始計數

基于Linux環境的進度條實現

直到變成 0 為止。

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

基于Linux環境的進度條實現

?三、進度條?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.亚洲
|
中文字幕在线不卡
|
午夜大片
|
久久亚洲视频网
|
欧美不卡在线
|
国产精品区二区三区日本
|
亚洲一区在线日韩在线深爱
|
欧美日韩一区二区三区四区五区
|
欧美涩|
国产精品不卡一区
|
毛片免费在线
|