写一个简单的进度条了解三个方面的知识:进度条的实现原理,linux下的回车,以及缓冲区
(1)进度条的实现原理:定义一个102的字符数组bar[102],首先第一个位置bar[0] ='/0',在while循环中:每次更新从0的位置开始写入n 个‘*’(每次从开始位置写入 涉及到回车问题),更新到100结束,n来控制进度条的进度或者写入多少个*。
(2)Linux下的回车问题:
Unix 系统里,每行结尾只有“<换行>”,即“/n”;Windows系统里面,每行结尾是“<回车><换行>”,即“ /r/n”;Mac
系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成
一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
在windows系统中,当你输入回车时会自动变成/r/n;在linux下的回车键只代表/n。
(3)缓冲区:
全缓冲:linux下默认为8192字节,在缓冲区满或者显示调用刷新函数后进行IO系统调用操作,
普通磁盘文件通常使用全缓冲区访问。
行缓冲区:默认大小为128字节,当在遇到换行符或者缓冲区满时,标准IO库执行IO系统调用操作,终端即行缓冲区。
非缓冲区:标准IO库不对字符进行缓存,标准出错流stderr通常是不带缓冲区的。
用PRintf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。Linux下缓冲区刷新到屏幕的方式:1使用fflush(stdout)强制刷新标准输出缓冲区。2.缓冲区已满。3.scanf()要在缓冲区里取数据时会先将缓冲区刷新。4./n进入缓冲区时。5. 程序结束时。
下面实现进度条:
#include<stdio.h>#include<unistd.h>int main(){ int i=0; char bar[102]; const char *label ="-//|/"; bar[0] = '/0'; while(i<=100) { printf("[%-101s][%d%%][%c]/r",bar,i,label[i%4]); fflush(stdout); bar[i++] = '#'; bar[i] = '/0'; sleep(1); } printf("/n"); return 0;}makefile:
bar:bar.c gcc -o bar bar.c.PHONY:cleanclean: rm -f bar
新闻热点
疑难解答