1.倒计时程序
在学习
Linux
进度条程序之前,我们可以再学习另一个更简单小程序—倒计时!
\r&&\n
平时我们电脑的时候都会使用到键盘,既然使用到键盘,那就必不可少地会使用到
Enter
键,也就是我们所说“回车键”,其实发生了两个动作:回车'\r
(光标回到行首),换行'\n'
(光标换到下一行),Enter
键即为回车换行键!平时在写C语言程序时,输出函数中'\n'
(回车符)也默认了回车换行两个动作!
老式键盘
现代键盘
缓冲区
在编译器中,我们有
stdin
(标准输入流),stdout
(标准输出流),stedrr
(标准错误流),每个标准流缓冲区;以标准输出流stdout
为例,使用printf
函数输出时,会将输出的数据放到输出缓冲区,刷新输出缓冲区,即将输出缓冲区的数据输出stdout
流(显示器)中,此时我们才可以看到输出的数据!
eg1:
//在gcc编译器下的代码
#include<unistd.h>
int main()
{
printf("hello world");
sleep(2);
return 0;
}
代码运行的结果:
eg2:
//在gcc编译器下的代码
#include<unistd.h>
int main()
{
printf("hello world\n");
sleep(2);
return 0;
}
代码运行的结果:
代码1的
printf函数
中没有’\n‘,sleep函数
(休眠函数)让程序休眠2秒,之后程序结束才能刷新缓冲区,将”hello world“
输出到显示器;代码2的printf函数
中有’\n'
,会将刷新缓冲区,将”hello world“
输出到显示器,sleep
函数(休眠函数)让程序休眠2秒才结束。
倒计时程序
学习自动化构建工具,我们可以创建文件
makefile
文件,向文件输入相应的指令!
指令如下:
test:main.c prosserBar.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -rf test
在
prosserBar.c
文件实现倒计时代码,在prosserBar.h
头文件中声明,在main.c
文件进行函数调用。
//
#include"prosserBar.h"
void countdown()
{
int cnt=10;//倒计时
while(cnt>=0)
{
printf("%-2d\r",cnt);
fflush(stdout);
cnt--;
sleep(1);//睡眠函数
}
printf("\n");
}
Xshell代码演示结果:
printf("%-2d\r",cnt);
中%-2d
输出的数字进行向左对齐,\r
光标在该行的行首,ffloush(stdout);
刷新缓冲区,在显示屏输出数字,使用sleep(1);
停顿一秒再进行下一个数字输出,从而达到停顿的效果。
2.进度条
prosserBar.h文件
#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define NUM 102 #define TOP 100
#define BODY '='
#define RIGHT '>'
//进度条 |~
void prosser(int speed);
prosserBar.c文件
void prosser(int speed)
{
const char* label="|/-\\";
char bar[NUM];
memset(bar,'\0',sizeof(bar));
int cnt=0;
int sz=strlen(label);
while(cnt<=TOP)
{
printf("[%-100s][%d%%][%c]\r",bar,cnt,label[cnt%sz]);/// 没有\n,就没有立即刷新,因为显示器模式是行刷新
fflush(stdout);
bar[cnt++]=BODY;
if(cnt<=100)
{
bar[cnt]=RIGHT;
}
usleep(speed);
}
printf("\n");
}
①定义一个进度字符数组bar初始化为
’0‘
和一个转动字符数组label并计算其长度为len;②在printf函数中使用[%-100s][%d%%][%c]
预留一定空间,'\r'
会将输出的光标回到行首,fflush(stdout);
都刷新缓冲区;③bar[cnt++]=BODY;
打印一次存放一个进度符号,模拟进度效果;④使用bar[cnt]=RIGHT;
达到进度条推进效果,直到进度条为满的状态(if
语句实现);⑤ iusleep(speed);
模拟某项工作所要花费的时间。
Xshell演示效果为: