@TOC
1. ProcBar.h
主要记录了函数的定义
#ifndef TEST_H_ #define TEST_H_ #include<stdio.h> #include<string.h> #include<unistd.h> #define M 101 #endif
使用
#ifndef TEST_H_ #define TEST_H_ #endif, 是防止头文件被重复多次包含
2. makefile
使用
vim makefile
,进入vim编辑器
ProcBar: ProcBar.c Main.c gcc $^ -o $@ .PHONY:clean clean: rm -f ProcBar
使用makefile,使其可借助
make
生成可执行程序,以及使用make clean
,删除可执行程序
3. Main.c
主要是函数的调用
#include"ProcBar.h" int main() { show(); return 0; }
4. ProcBar.c
主要是函数的实现
1.缓冲区问题
#include"ProcBar.h" void show() { printf("hello world!\n"); sleep(3);//睡眠3秒 }
发现当
在有\n的情况下,先输出hello world!,然后程序在3秒后结束
#include"ProcBar.h" void show() { printf("hello world!");//1 sleep(3);//睡眠3秒 //2 }
而在
没有\n的情况下,却是先睡眠3秒
,这就很不正常
由于是自上而下执行的,所以肯定是要先执行printf内容的,再进行休眠
但为什么得到的结果不一样呢?
是因为
行缓冲的刷新策略是遇见\n后才刷新
,
第二次没有\n的情况,printf的内容在缓冲区中。
2. 解决方法
使用c语言库中的函数
在这里插入图片描述通过查询c官网知道,该函数内部是一个流的存在。我们想要将缓冲区的内容显示到屏幕上,就需要使用fflush
标准输出流stdout
#include"ProcBar.h" void show() { printf("hello world!");//1 fflush(stdout); sleep(3);//睡眠3秒 //2 }
这样就会跟第一次有\n的一样正常刷新,
即先出现hello world! ,再睡眠2秒结束程序
3. \n与\r的区别
\n代表的是换行
\r代表的是回车
在这里插入图片描述
当光标所处为红圆圈的位置时,使用\n,发现只会到下一行相同的位置
在这里插入图片描述
当光标所处为红圆圈的位置时,使用\r后,回到该行的行首
4.整体代码的实现
#incldue"ProcBar.h" void show() { int i=0; char Bar[M]; memset(Bar,'\0',sizeof(Bar));//初始化为'\0' char *grade="|/-\\";//使用\\ ,否则会识别错误 while(i<=100) { printf("[%-100s] [$d%] [%c] \r",Bar,i,grade[i%4]); fflush(stdout); usleep(10000); Bar[i++]='#'; } }
usleep也是c语言的函数,代表以微秒计时