Linux第一个小程序-进度条
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
前言
我们已经学习了一段时间的
linux
知识我们也要学以致用一下对于我们的知识更加的掌握所以我们自己写一个小程序进度条。
但是再写进度条的时候我们必须要掌握几个我们新接触的知识点
1.\r
和\n
的理解
2.缓冲区的理解
只有理解了这两个知识点我们写起进度条才会变得十分简单。
知识点一:\r
和\n
的理解
理解字符的含义
我们再学C语言的时候我们有很多字符一种是可显字符另一种是控制字符
我们在一行内容没有写完然后要换到下一行的开始我们要进行两个操作第一个操作让光标从第一行跳到第二行但是光标只是垂直向下跳并没有在第二行的开始。这个操作就是换行。
所有第二个操作就是在第二行让光标跳到最开始的位置这个操作就是回车。
所以现在我们的两个字符的意思就可以解释了
\r
:回车。
\n
换行
这时有的同学就问我们在C语言的时候怎么用\n
来换行加回车。这是我们在这个语言环境下我们将其简化此时的\n
就表示回车加换行。
测试字符
我们一共测试三种情况一种是两个都有
\r和\n
另一个是只有\n
最后一个是只有\r
。
\r \n
都存在
我们看下图发现我们在其中既有回车又有换行所以其
linux
的命令行在我们执行程序下面。
只有\n
我们在上面说了这是我们在这个语言环境下我们将其简化此时的
\n
就表示回车加换行。
所以结果和上面一样就参考上图就ok了。
都没有\r \n
我们可以猜想一下我们的
\r \n
都没有我们的光标就在文本行的最后所以我们的linux命令就直接跟在文本行后面那么我们看结果是不是吧。
只有\r
我们知道原理我们可以自己猜一下实验结果因为我们
\r
,只有回车的效果我们本来光标在文本行的最后一个字符旁边但是我们识别到\r
字符所以直接回车光标来到了文本行的开始。这时linux的命令行就会从光标处开始将我们的文本覆盖掉我们就什们都看不到。
知识点二缓冲区的概念
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello world");
sleep(3);
}
我们发现
hello world
没有立刻刷新出来数据一定在sleep
期间被保存起来,但是我们加上\n
数据就会先显示出来。
就是因为缓冲区有自己的行缓冲刷新策略。
倒计时小程序
我们知道了上面两个知识点
\r
将光标回到最开始就可以将其覆盖掉所以我们利用这个特点可以写一个倒计时小程序我们先写一个10秒以内的倒计时小程序。
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 int i=0;
7 for(i=9;i>=0;i--)
8 {
9 printf("%d\r",i);
10
11 sleep(1);
12 }
13 return 0;
14 }
我们发现这样倒计时不显示原因是数据存放在缓冲区里我们没有刷新缓冲区所以我们没有显示所以我们修改一下就OK了
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 int i=0;
7 for(i=9;i>=0;i--)
8 {
9 printf("%d\r",i);
10 fflush(stdout);
11 sleep(1);
12 }
13 return 0;
15 }
这样我们的倒计时代码就改好了但是如果我们突然变成10秒以后的发现不能将两位数字都覆盖掉因为最后由两位数变成了1位数所以我们还要做一点修改。
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 int i=0;
7 for(i=9;i>=0;i--)
8 {
9 printf("%-2d\r",i);
10 fflush(stdout);
11 sleep(1);
12 }
13 return 0;
15 }
~
进度条
现在我们就可以开始我们的进度条了。
(1)进度条的样式
就是这样子的
[#########################################] [%100] [/]
其原理就是不断地覆盖然后将其像早以前的动画片一样变成一个动画。
第一个中括号就是表示进度条。第二个中括号表示进度。第三个表示旋转样式。
(2)编写进度条代码
我们先创建三个文件
proc.h
编写进度条的头文件
proc.c
编写进度条的函数
main.c
测试进度条
<1>proc.h
内容
1 #pragma once
2
3 #include <stdio.h>
4
5 void process(); ~
<2>main.c
内容
1 #include "proc.h"
2
3 int main()
4 {
5 process();
6 return 0;
7 }
<3>proc.c
内容
其中这个是最重要的他要包括我们当中的
process
实现的函数.
代码中有解释详细看代码
1 #include"proc.h"
2 #include<unistd.h>
3 #include<string.h>
4
5 // "|/-\"旋转标志
6 void process()
7 {
8 const char* lable ="|/-\\";
9
10 //为什们要定义101个字符
11 //就是因为我们的进度条有100个
12 //但是字符的结尾要用\0表示所以我们要有101个字符
13 char bar[101];
14 //先将进度条设置为\0然后在依次增加#。
15 memset(bar,'\0',sizeof(bar));
16 int i=0;
17 while(i<=100)
18 {
19 printf("[%-100s] [%d%%] [%c]\r",bar,i,lable[i%4]);
20 fflush(stdout);
21 bar[i++]='#';
22 usleep(100000);
23 }
24 printf("\n");
25
26 }
(3)实现
总结
我们这个进度条就是将我们的知识融汇贯通大家不是学习了新的东西就是将知识学明白了而是将我们的这些知识运用起来才是学会了这些东西所以我们大家一起加油一起进步