Linux下的一个进度条小程序
本篇文章笔者带大家完成一个简单的程序编写,让我们在Linux命令行下实现一个进度条小程序。具体效果如下图所示,感兴趣的话就耐心看完笔者的本篇文章吧!
程序的实现非常简单,不过在写程序前我们需要先了解几个概念:
首先初学者可以非常好奇,我们是如何实现改变同一行的信息使 # 不断变长的。这个地方就涉及到了本文的第一个知识点:回车和换行的概念。回车大家以及耳熟能详了,它就是我们键盘上的 Enter 键,在我们每次打字输出时,按一次 Enter 键我们就能换到下一行,并且光标的位置到达行首。所以这个动作我们可以看作两步——首先换至下一行,然后光标到此行的行首。换至下一行的过程叫做换行,光标到此行的行首的动作叫做回车。所以我们键盘上的 Enter 键其实是换行 + 回车,只不过我们经常叫做回车。
而在我们C语言 printf 函数中有 ‘\r’ 这个字符,它所代表的意义就是回车,当我们仅输出 \r 时我们的输出光标位置就会回到行首进行打印,而打印出来的内容则会替换本行之前的内容,这样我们就实现了改变同一行的内容进行输出。
大家对换行和回车有了一定的概念后,就有了下面一个概念:输出缓冲区的问题。
我们写了下面的代码,希望可以每一秒钟打印一次 hello ,我们运行一下试一试
此时我们发现运行结果与我们预期相差甚远,在程序结束时我们想要的 hello 才被打印出来,并且是三个一起出来的。这就涉及到输出缓冲区的概念了,我们实际输出的数据并没有第一时间打印到终端上而是先写入到输出缓冲区中。在程序结束时缓冲区的数据释放,所以产生了我们看到的结果。缓冲区的数据在遇到 \n 会自动刷新。但是我们要写的程序不想出现换行怎么办呢?我们也可以使用函数 fflush 进行刷新,在我们需要刷新的时候调用函数:
fflush(stdout);
了解了上面的两个概念我们写出进度条的程序就很容易了,我们可以创建一个字符数组存储 # 每次刷新的时候增加 # 的个数,程序代码如下请大家参考指正:
1 #include <stdio.h>
2 #include <unistd.h>
3
4 char state[] = "/-\\-";
5
6 int main()
7 {
8 char arr[102] = { 0 };
9 int i = 0;
10
11 while(i <= 100)
12 {
13 printf("[%-100s][%3d%%][%c]\r", arr, i, state[i%4]);
14 arr[i] = '#';
15 i++;
16
17 usleep(10000);
18 fflush(stdout);
19 }
20 printf("\n");
21
22 }