进度条是我们日常生活中经常会见到的事物,就用Linux模拟实现一个粗糙的进度条小程序。关于进度条,涉及到三个小知识点:
1.回车换行
回车:\n
换行:\r
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return
换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed
2.关于缓冲区
fflush·fflush函数
fflush()函数冲洗流中的信息,该函数通常用于处理磁盘文件。
函数名: fflush
功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时
头文件:unistd.h
原型:int fflush(FILE *stream)
其中stream是要冲洗的流
fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中. 如果参数stream 为NULL,fflush()会将所有打开的文件数据更新
返回值:fflush 的返回值类型是int类型,那么这个int类型具体的返回是什么呢?
如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
注意:如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数
其他用法:
fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
3.进度条的原理是从最开始处,逐次增长进度。
这是程序的代码:
运行程序的时候需要用到Makefile
直接在程序代码的目录中touch一个文件Makefile,在这个文件中目前只需要简单的添加进程序编译的依赖关系和依赖方法就可以:
对于.PHONY的修饰的伪标签clean,是用来做一些程序结束之后的清理工作的,接下来就可以通过make指令来执行我们的程序了:
程序最后面的是一个由四个特殊字符| \ / -构成的,是在进度条读取的过程中用来确定进度条在工作而没有卡死的标志。
程序源代码:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i = 0;
int bar[52];
char *label = "-\\|/";
bar[0] = '\0';
while(i <= 50)
{
printf("[%-52s][%d%%]%c\r",bar,2*i,label[i%4]);
fflush(stdout);
bar[i++] = '#';
bar[i] = '\0';
usleep(50000);
}
printf("\n");
return 0;
}