久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


基于Linux環境的進度條實現


前言

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, '

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