C语言进度条的实现原理详解

 更新时间:2022年08月29日 10:01:53   作者:小小酥诶  
这篇文章主要介绍了C语言进度条的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

\r和\n

在程序里面,\r\n分别代表什么意思?

\r:表示“回车”,即回到当前行的起始位置

\n:表示换行,即列不变,另其一个新行

行缓冲区

什么是行缓冲区?先别慌,来看代码一执行会是什么样的状态。

//代码一,mytest.c文件
# include <stdio.h>
int main(void)
{
  printf("hello linux");                                                                                                                                    
  sleep(1);
  return 0;
}

现象:光标休息一秒后,打印出hello linux。

那这个现象是不是说明了,sleep先执行,printf函数后执行呢?

并不是的,在执行sleep函数之前printf函数已经被执行了,只是数据暂时存放到了行缓冲区内,没有立即刷新出来。行缓存区只有在输入和输出中遇到换行符时,缓冲区才立即刷新,然后把数据传给磁盘,执行真正的I/O操作。

有了一个认知后

//代码二,mytest.c文件
 # include <stdio.h>
 int main(void)
 {
   printf("hello linux\r");//添加了回车                                                                                                                                    
   sleep(1);
   return 0;
 }

因为内容被放到了行缓冲区内,刷新缓冲区的时候,hello linux本来是刷新出来了的,但是由于有一个\r回车符,然后又回到了行首的位置,导致数据被覆盖了。所以休眠了一秒之后,什么也没有被显示到屏幕上。

进度条

根据上面的行缓存区的知识

总结出进度条的一个制作方法:

假设以#作为进度条的一个显示,第一次输出#,立即刷新出来;利用\r回车的知识,第二次让它回到改行行首的位置,输出##,立即刷新出来;同样的第三次回到该行行首,然后输出###……

想法很美好,理论可以成功,开始实践……

 # include <stdio.h>
 # include <string.h> //别忘记包含memset函数的头文件
 int main(void)
 {
   char buffer[102]; //开辟一个能容纳102个字符的数组
   memset(buffer, 0, sizeof(buffer));//将字符数组的每一个字节都初始化为0
   int i = 0;
   while(i <= 100)
   {
     printf("[%-100s][%d%%]\r", buffer, i); //控制输出的格式
     fflush(stdout); //立即刷新标准输出流                                                                                                                      
     buffer[i++] = '#'; //把i下标的空间初始化为#之后,++i
     usleep(50000); //因为usleep是毫秒为单位,进度条时间可以自己控制
   }                                      
   printf("\n");//最后的时候换个行更加美观
   return 0;                              
 }                                        

实践成功,达到了我预期的效果,perfect!

到此这篇关于C语言进度条的实现原理详解的文章就介绍到这了,更多相关C语言进度条内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Qt实现可扩展对话框的示例代码

    利用Qt实现可扩展对话框的示例代码

    可扩展对话框通常用于用户对界面有不同要求的场合。当供高级用户使用或需要更多信息时,可通过某种方式的切换显示完整对话窗体(扩展窗体)。本文将用Qt实现可扩展对话框,需要的可以参考一下
    2022-06-06
  • Qt中QTextEdit限制只能输入数字英文逗号

    Qt中QTextEdit限制只能输入数字英文逗号

    这篇文章主要给大家介绍了关于Qt中QTextEdit限制只能输入数字英文逗号的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-06-06
  • 使用emacs编写C语言教程

    使用emacs编写C语言教程

    这篇文章主要介绍了使用emacs编写C语言教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++回溯法解决1到9之间插入加减或空使运算结果为100

    c++回溯法解决1到9之间插入加减或空使运算结果为100

    编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100
    2021-10-10
  • 使用C语言如何输出逆序数

    使用C语言如何输出逆序数

    逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?下面这篇文章主要给大家介绍了关于使用C语言如何输出逆序数的相关资料,需要的朋友可以参考下
    2022-01-01
  • C/C++实现遍历文件夹最全方法总结

    C/C++实现遍历文件夹最全方法总结

    这篇文章主要为大家介绍了C/C++实现遍历文件夹功能的最全方法总结,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • C++用easyx图形库实现障碍跑酷小游戏

    C++用easyx图形库实现障碍跑酷小游戏

    这篇文章主要为大家详细介绍了C++用easyx图形库实现障碍跑酷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++递归与分治算法原理示例详解

    C++递归与分治算法原理示例详解

    这篇文章主要为大家介绍了C++递归与分治算法的策略原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • C语言中#define在多行宏定义出错的原因及分析

    C语言中#define在多行宏定义出错的原因及分析

    这篇文章主要介绍了C语言中#define在多行宏定义出错的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 基于Qt实现简易GIF播放器的示例代码

    基于Qt实现简易GIF播放器的示例代码

    这篇文章主要介绍了如何利用Qt设计一个简易GIF播放器,可以播放GIF动画。其基本功能有载入文件、播放、暂停、停止、快进和快退,感兴趣的可以了解一下
    2022-06-06

最新评论