Linux小程序——进度条

举报
lovevivi 发表于 2022/10/19 18:28:46 2022/10/19
【摘要】 @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使...

@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语言库中的函数 fflush

在这里插入图片描述

通过查询c官网知道,该函数内部是一个流的存在。
我们想要将缓冲区的内容显示到屏幕上,就需要使用标准输出流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语言的函数,代表以微秒计时

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。