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语言进度条内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解C语言栈的创建

    深入了解C语言栈的创建

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对栈的实现基本操作
    2021-07-07
  • Win10+VS2017新CUDA项目配置教程

    Win10+VS2017新CUDA项目配置教程

    这篇文章主要为大家详细介绍了Win10+VS2017新CUDA项目配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C++ 中的Swap函数写法汇总

    C++ 中的Swap函数写法汇总

    这篇文章主要介绍了C++ 中的Swap函数写法汇总,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 完美解决QT QGraphicsView提升到QChartView报错的问题

    完美解决QT QGraphicsView提升到QChartView报错的问题

    使用QT提供的QChartView来绘制图表,提升QGraphicsView控件继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错呢,下面小编给大家带来了QT QGraphicsView 提升到QChartView报错解决方案,感兴趣的朋友一起看看吧
    2023-05-05
  • 探讨C++中数组名与指针的用法比较分析

    探讨C++中数组名与指针的用法比较分析

    本篇文章是对C++中数组名与指针用法的比较进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 适合初学者的C语言转义字符讲解

    适合初学者的C语言转义字符讲解

    转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现(没有转义字符开头)时的语义。因此转义字符开头的字符序列被叫做转义序列
    2022-04-04
  • 利用C语言编写“剪刀石头布”小游戏

    利用C语言编写“剪刀石头布”小游戏

    这篇文章主要给大家介绍了关于如何利用C语言编写“剪刀石头布”小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 基于errno返回值的对应错误码的详细介绍

    基于errno返回值的对应错误码的详细介绍

    本篇文章是对errno返回值的对应错误码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言菜鸟基础教程之条件判断

    C语言菜鸟基础教程之条件判断

    本文给大家简单介绍了下C语言中的条件判断语句的语法和用法示例,非常简洁实用,有需要的小伙伴可以参考下
    2017-10-10
  • C++利用libcurl库实现多线程文件下载

    C++利用libcurl库实现多线程文件下载

    这篇文章主要为大家详细介绍了C++如何利用libcurl库实现多线程文件下载,文章的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-01-01

最新评论