1.缓冲区代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>int main(){ printf("hello bite!"); sleep(2); return 0;}
执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢?
因为:
在printf执行完了后,打印的内容被存到了缓冲区程序快结束时缓存区的内容再打印到显示器奇妙的事情发生了:
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>int main(){ printf("hello bite! "); sleep(3); return 0;}
如果我们使用这样的代码,会 先打印出hello bite,再停顿两秒,为啥捏?
可以发现和上面的代码对比多了一个/n
显示器有一种刷新策略,叫 行刷新而 /n正好代表着换行,所以加了/n的内容会 直接从缓存区打印到显示器上,不用等程序结束那么我们有没有办法 不用 也能先打印呢? 包有的:
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>int main(){ printf("hello bite!"); fflush(stdout); sleep(3); return 0;}
#include"process.h" 2 #include<string.h> 3 #include<unistd.h> 4 5 #define size 101//需要考虑 所以不是100 6 #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] ",num,rate,lable[rate%length]);//100s是指预留100个字符,主要是为让】不动,但这样会导致倒着打印,所以需要加-, 是指每次打印完了之后都恢复到原位置 18 fflush(stdout);//这里因为没有 所以需要fflush进行刷新 19 num[rate]=style; 20 ++rate; 21 usleep(50000);//usleep和sleep不同,前者单位是微秒 50000微秒=0.5秒 22 } 23 24 printf(" "); 25 }
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] ",tips,num,rate,lable[index++]);//进度保留一位小数 44 fflush(stdout);//因为没有使用 ,却又想直接刷新,所以需要fflush,记得包头文件#include<unistd.h> 45 index %=len; 46 if(n>=100)printf(" "); 47 }
#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%,所以需要改为total 25 } 26 } 27 28 29 30 31 int main() 32 { 33 download(1024.0,flushprocess);//传递文件大小和函数地址 34 printf("下载 1024.0MB 完成 "); 35 download(512.0,flushprocess); 36 printf("下载 512.0MB 完成 "); 37 download(256.0,flushprocess); 38 printf("下载 256.0MB 完成 "); 39 download(128.0,flushprocess); 40 printf("下载 128.0MB 完成 "); 41 42 return 0; 43 }
效果如下:
以上就是Linux探秘坊-------4.进度条小程序的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号