1.緩沖區
#include <stdio.h>
int main()
{printf("hello bite!");sleep(2);return 0;
}
執行此代碼后,會 先停頓兩秒,再打印出hello bite
,但是明明打印在sleep前面,為什么會后打印呢?
因為:
- 在printf執行完了后,打印的內容被存到了緩沖區
- 程序快結束時緩存區的內容再打印到顯示器
奇妙的事情發生了:
#include <stdio.h>
int main()
{printf("hello bite!\n");sleep(3);return 0;
}
如果我們使用這樣的代碼,會 先打印出hello bite,再停頓兩秒
,為啥捏?
可以發現和上面的代碼對比多了一個/n
- 顯示器有一種刷新策略,叫
行刷新
- 而
/n正好代表著換行
,所以加了/n的內容會直接從緩存區打印到顯示器上
,不用等程序結束
那么我們有沒有辦法 不用\n也能先打印呢?
包有的:
#include <stdio.h>
int main()
{printf("hello bite!");fflush(stdout);sleep(3);return 0;
}
- 這里的fflush(stdout)就起到了
刷新的作用
2.進度條(V1)
1.process.h
2.main.c
3.process.c(重點)
#include"process.h"2 #include<string.h>3 #include<unistd.h>4 5 #define size 101//需要考慮\0所以不是1006 #define style '#'7 8 void process()9 {10 int rate =0;11 char num[size];12 memset(num,0,sizeof(num));//這里是讓num全部置空
W> 13 char* lable="|/-\\";//這里是模擬進度條后的圈圈14 int length=strlen(lable);15 while(rate<=100)16 {17 printf("[%-100s][%d%%][%c]\r",num,rate,lable[rate%length]);//100s是指預留100個字符,主要是為讓】不動,但這樣會導致倒著打印,所以需要加-, \r是指每次打印完了之后都恢復到原位置18 fflush(stdout);//這里因為沒有\n所以需要fflush進行刷新19 num[rate]=style;20 ++rate;21 usleep(50000);//usleep和sleep不同,前者單位是微秒 50000微秒=0.5秒22 }23 24 printf("\n");25 }
3.進度條(V2)
1.process.h
2.process.c(重點)
void flushprocess(const char*tips, double total,double current)29 {30 const char *lable="|/-\\";31 int len =strlen(lable);32 static int index=0;33 char num[size];34 memset(num,0,sizeof(num));//將num置空35 36 double rate=current*100.0/total;//計算下載進度37 int n=(int)rate;//用下載進度確定有多少個# 38 39 int i=0;40 for(;i<n;i++)41 num[i]=style;//填充#到num中42 43 printf("%s...[%-100s][%.1lf%%][%c]\r",tips,num,rate,lable[index++]);//進度保留一位小數44 fflush(stdout);//因為沒有使用\n,卻又想直接刷新,所以需要fflush,記得包頭文件#include<unistd.h>45 index %=len;46 if(n>=100)printf("\n");47 }
3.main.c(重點)
#include"process.h"3 #include<unistd.h>4 #include<time.h>5 #include<stdlib.h>6 7 typedef void (*call)(const char*, double,double);//定義函數指針類型8 9 10 11 double speed[]={5.0,0.5,0.3,0.02,0.1,0.01};//模擬網速的波動 12 13 void download(int total,call cb) 14 { 15 srand(time(NULL));//設置種子 16 double current =0.0; 17 while(current<=total) 18 { 19 cb("下載中 ",total,current); 20 if(current>=total)break; 21 int random=rand()%6;//隨機匹配網速 22 usleep(5000); 23 current+=speed[random];//加上每次下載的進度 24 if(current>=total)current=total;//有可能總和超過total,這樣就沒法顯示100%,所以需要改為total25 } 26 } 27 28 29 30 31 int main() 32 { 33 download(1024.0,flushprocess);//傳遞文件大小和函數地址 34 printf("下載 1024.0MB 完成\n"); 35 download(512.0,flushprocess); 36 printf("下載 512.0MB 完成\n"); 37 download(256.0,flushprocess); 38 printf("下載 256.0MB 完成\n"); 39 download(128.0,flushprocess); 40 printf("下載 128.0MB 完成\n"); 41 42 return 0; 43 }
效果如下: