在说进度条前我们先来看一下关于缓冲区
缓冲区分为全缓冲,行缓冲区和无缓冲区

1,全缓冲区:这种缓冲区要求填满整个缓冲区后才进行I/O 系统调用操作。对于磁盘文件通常使用全缓冲区访问。第一次执行I/O 操作时,ANSI 标准的文件管理函数通过调用malloc 函数获得需使用的缓冲区。默认大小为8192。

2,行缓冲区:在这种情况下,当在输入和输出中遇到换行符时,标准I/O 库执行I/O系统调用操作。当流涉及一个终端时(例如标准输入和标准输出),使用行缓冲区。因为标准I/O 库收集的每行的缓冲区长度是固定的,只要填满了缓冲区,即使还没有遇到换行符,也将执行I/O 系统调用操作。默认行缓冲区大小为128 字节。

3,无缓冲区:标准I/O 库不对字符进行缓存。如果用标准I/O 函数写若干字符到不带缓冲区的流中,则相当于用write 系统调用函数将这些字符写至相关联的打开文件。标准出错流stderr 通常是不带缓冲区的,这使得出错信息能够尽快地显示出来。

下来我们来看两个小程序

int main()
   {
   printf("hello world\n");
   sleep(3);
   return 0;
   }
       分析一下这个程序,这个程序的结果毫无疑问是在显示器上面输出 hello world,然后在停三秒,下来我们做一点小小的改动

        int main()
   {
   printf("hello world");
   sleep(3);
   return 0;
   }
  大家可以看到我们在原来程序的基础上去掉了 \n
   那么程序的结果会是什么呢
   我们可以在linux的vim下尝试一下
   相信尝试过的人都会知道这个程序的结果是先停三秒然后在输出hello world

大家会想只有这么小小的改动,怎么差别却这么大
下面我们来解释一下
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
1 缓冲区填满
2 写入的字符中有‘\n’ ‘\r’
3 调用fflush手动刷新缓冲区
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

满足上面4个条件之一缓冲区就会刷新,,也就是printf会真正调用write来写入

插入一个小小的知识

回车:只回到最开始     \r
  换行:换下一行             \n
  回车换行:先回到当前行行首再换下一行

下来我们进入正题,linux下的进度条

linux设置消息队列大小_进度条

上图是我用linux下的vim编写的一个进度条的程序
温馨提示一下,如果你的电脑输出显示的很多行,并不是程序的问题,把字体放小一点,页面放大一点,就可以了哦~