Linux小程序
在Linux中我們實(shí)現(xiàn)兩個(gè)小程序來(lái)體會(huì)\r和\n的區(qū)別,以及緩沖區(qū)是什么?
前言
回車和換行的區(qū)別
對(duì)于 \r 和 \n 的理解:
- \n 表示換行且回到下一行的最開始的位置
- \r 表示的是回車,即將光標(biāo)回到當(dāng)前行最開始的位置
在C語(yǔ)言中,我們單單使用“\n”就可以實(shí)現(xiàn)換行回車,但是”\r“只能表示回車
//在定義中\(zhòng)n表示的是換行符號(hào),只是在語(yǔ)言實(shí)現(xiàn)中,包含了自動(dòng)回車這一功能,最后導(dǎo)致,\n為換行回車
#include<stdio.h>
void Func1()
{
printf("hello world\n");
printf("換行+回車\n"); //hello world
return; //換行+回車
}
void Func2()
{
printf("123456\r");
printf("654\n"); //測(cè)試結(jié)果為654456
return;
}
int main()
{
printf("測(cè)試換行\(zhòng)n");
Func1();
printf("測(cè)試回車\n");
Func2();
return 0;
}
緩沖區(qū)
Linux緩沖區(qū)是指在內(nèi)存中開辟的一塊區(qū)域,用于存儲(chǔ)輸入輸出數(shù)據(jù)的臨時(shí)存儲(chǔ)區(qū)域。當(dāng)應(yīng)用程序向文件或設(shè)備進(jìn)行讀寫操作時(shí),數(shù)據(jù)會(huì)先被存儲(chǔ)到緩沖區(qū)中,然后再由緩沖區(qū)將數(shù)據(jù)寫入磁盤或設(shè)備中。緩沖區(qū)的作用是提高數(shù)據(jù)讀寫的效率,減少磁盤或設(shè)備的訪問次數(shù),從而提高系統(tǒng)的性能。在Linux系統(tǒng)中,緩沖區(qū)的大小可以通過修改內(nèi)核參數(shù)來(lái)進(jìn)行調(diào)整。
我們來(lái)看看緩沖區(qū)的體現(xiàn)
認(rèn)識(shí)fflush函數(shù)
fflush(stdin)是清空輸入緩存的函數(shù),在輸入字符之前調(diào)用它可以清除之前未讀取的字符。
fflush(stdout)是刷新輸出緩沖區(qū)的函數(shù),它可以強(qiáng)制將緩沖區(qū)中的輸出立即發(fā)送到輸出設(shè)備(通常是顯示器)。它對(duì)應(yīng)的頭文件是<stdio.h>
#include<stdio.h>
#include<unistd.h> //sleep的頭文件
int main()
{
printf("hello world!")
fflush(stdout); //刷新緩沖區(qū)
sleep(2);
return 0;
}
總結(jié)
- \n 自帶刷新緩沖區(qū)的功能
- fflush(stdout)可以強(qiáng)制刷新輸出緩沖區(qū)的函數(shù)
小程序的實(shí)現(xiàn)
我們學(xué)習(xí)了上文中的換行和回車,以及緩沖區(qū)的概念,以此嘗試在Linux中嘗試做兩個(gè)小程序,倒計(jì)時(shí)和進(jìn)度條程序的實(shí)現(xiàn)。
倒計(jì)時(shí)程序
結(jié)合換行和回車,以及緩沖區(qū)的概念,我們可以實(shí)現(xiàn)倒計(jì)時(shí)
# include<stdio.h>
# include<unistd.h>
void Fun1(int n)
{
//實(shí)現(xiàn)倒計(jì)時(shí)的函數(shù)
int i=n;
for(; i >= 0 ; i-- )
{
printf("%-5d\r",i);
fflush(stdout);
sleep(1);
}
}
int main()
{
//實(shí)現(xiàn)倒計(jì)時(shí),我們測(cè)試過緩沖區(qū)和換行回車
//倒計(jì)時(shí)的實(shí)現(xiàn)應(yīng)該是使用 \r 回車符號(hào),不斷變更數(shù)值
int n=0;
printf("請(qǐng)輸入N的數(shù)值:");
scanf("%d",&n);// 實(shí)現(xiàn)任意倒計(jì)時(shí)
//實(shí)現(xiàn)函數(shù)主體
Fun1(n);
return 0;
}
進(jìn)度條程序
進(jìn)度條是指通過展示下載的過程(進(jìn)度)以及百分比還有加載光標(biāo),來(lái)模擬進(jìn)度條。
Progressbar.h
進(jìn)度條頭文件,我們?cè)诶锩媛暶骱瘮?shù),宏定義變量,導(dǎo)入頭文件。
//下面是Progressbar.h文件內(nèi)容
# pragma once
#include<stdio.h>
#include<unistd.h>
//進(jìn)度條的頭文件,進(jìn)行設(shè)置宏定義
#define Num 102
#define Top 100
#define Body '='
#define Right '>'
//聲明函數(shù)
extern void progressbar(int speed);//實(shí)現(xiàn)
extern void initbar(); //初始化
Progressbar.c
//實(shí)現(xiàn)進(jìn)度條程序的主要文件
#include<stdio.h>
#include "ProgressBar.h"
#include<string.h>
#include<unistd.h>
//方案二:
const char* lable="\\|/-";
char bar[Num];
#define GREEN "\033[0;32;32m" //這是改變打印的顏色語(yǔ)句
#define NONE "\033[m"
void progressbar(int rate) //rate表示的是當(dāng)前的進(jìn)下載進(jìn)度 0-100區(qū)間的范圍
{
//rate 表示的是當(dāng)前下載進(jìn)度
if(rate<0||rate>100 ) return ;
int len=strlen(lable);
printf(GREEN"[%-100s]"NONE"[%d%%][%c]\r",bar,rate,lable[rate%len]);
fflush(stdout); //使用fflush強(qiáng)制刷新輸出緩沖區(qū)
bar[rate++]=Body;
if(rate<100) bar[rate]=Right; //只要沒有超過100 就加上Right
}
void initbar()
{
memset(bar,'\0',sizeof(bar));
}
//下面是第一種方法,直接調(diào)用progressbar(加載速度) 傳參為speed 即文件下載速度
//方案一:
//void progressbar(int speed)
//{
// //實(shí)現(xiàn)進(jìn)度條代碼
// char bar[Num];
// //初始化bar
// memset(bar, '\0', sizeof(bar));
//
// //使用while循環(huán)實(shí)現(xiàn)
// int len = strlen(lable);
// int count = 0;
// while (count <= 100)
// {
// //進(jìn)行打印
// printf("[%-100s][%d%%][%c]\r", bar, count, lable[count % len]);
// fflush(stdout); //沒有\(zhòng)n,就無(wú)法刷新,只能手動(dòng)刷新,使用fflush,顯示器默認(rèn)的是行刷新
// bar[count++] = Body;
// if (count < 100) bar[count] = Right;
// usleep(speed);
// }
// printf("\n");
//}
test.c
這是主要文件,從該文件傳參實(shí)現(xiàn)文件的運(yùn)行
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-580696.html
#include<stdio.h>
#include"ProgressBar.h"
typedef void (*callback_t)(int);// 函數(shù)指針類型
void downLoad(callback_t cb) //使用函數(shù)指針來(lái)調(diào)用
{
//callbak_t 實(shí)際上就是表示一個(gè)參數(shù)為int的函數(shù)指針,那么cb表示這個(gè)函數(shù)名
int total =1000; //下載的總?cè)萘?/span>
int curr=0; //當(dāng)前下載的容量
while(curr<=total)
{
usleep(50000); //表示模擬下載花費(fèi)的時(shí)間
int rate=curr*100/total; //更新進(jìn)度
cb(rate);//將rate參數(shù)傳遞給cb函數(shù)(形參)
curr+=10;//表示一次循環(huán)下載了一部分
}
printf("\n");
}
int main()
{
printf("下載1:\n");
downLoad(progressbar);
initbar(); //進(jìn)行對(duì)于bar初始化
printf("下載2:\n");
downLoad(progressbar);
initbar(); //下載一次就要進(jìn)行初始化
printf("下載3:\n");
downLoad(progressbar);
initbar();
printf("下載4:\n");
downLoad(progressbar);
initbar();
return 0;
}
//方案一: 手動(dòng)控制每一次加載usleep的時(shí)間
//int main()
//{
// //實(shí)現(xiàn)進(jìn)度條的主程序
// printf("第一次加載:\n");
//
// progressbar(100000);
//
// return 0;
//}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-580696.html
總結(jié)
- \n和\r我們都進(jìn)行了解釋和演示,對(duì)于緩沖區(qū)的概念圖文解釋,認(rèn)識(shí)到了兩種方式來(lái)強(qiáng)制刷新緩沖區(qū)。
- 標(biāo)準(zhǔn)輸入(stdin)標(biāo)準(zhǔn)輸出(stdout)標(biāo)準(zhǔn)錯(cuò)誤 ,我們認(rèn)識(shí)到了fflush函數(shù)來(lái)強(qiáng)制刷新
- \n 實(shí)際上是執(zhí)行換行+回車操作的,也有刷新緩沖區(qū)的作業(yè)
- 我們實(shí)現(xiàn)了兩個(gè)Linux上的小程序,倒計(jì)時(shí)以及進(jìn)度條。
到了這里,關(guān)于Linux小程序:倒計(jì)時(shí)和進(jìn)度條的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!