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

目录
  • \r和\n
  • 行缓冲区
  • 进度条

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

(0)

相关推荐

  • C语言实现类似wget的进度条效果

    本文主要是类似wget的进度条的实现,实际就是转移符\r的使用,\r的作用是返回至行首而不换行 复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <unistd.h> //类似wget的进度条的实现,实际就是转移符\r的使用,\r的作用是返回至行首而不换行 int main(int argc, char *argv[]) {     unsigned len = 60;     char *bar =

  • C语言实现变色进度条

    C语言实现一个如下的变色进度条,供大家参考,具体内容如下 要求 1.依次多打印一个'#' 2.并后面标注百分比 3.还可以进行变色 实现进度条(未变色) strip.c #include<stdio.h> #include<unistd.h> #define M 100 int main() { char ch = '#'; char str[M] = {0}; int i = 0; char symbol[4] = {'|','/','-','\\'}; for(i = 0; i

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

    目录 \r和\n 行缓冲区 进度条 \r和\n 在程序里面,\r和\n分别代表什么意思? \r:表示“回车”,即回到当前行的起始位置 \n:表示换行,即列不变,另其一个新行 行缓冲区 什么是行缓冲区?先别慌,来看代码一执行会是什么样的状态. //代码一,mytest.c文件 # include <stdio.h> int main(void) { printf("hello linux"); sleep(1); return 0; } 现象:光标休息一秒后,打印出hello

  • Python进度条tqdm的用法详解

    前言 有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况.这对于第三方库非常丰富的Python来说,想要实现这一功能并不是什么难事. tqdm就能非常完美的支持和解决这些问题,可以实时输出处理进度而且占用的CPU资源非常少,支持windows.Linux.mac等系统,支持循环处理.多进程.递归处理.还可以结合linux的命令来查看处理情况,等进度展示. 大家先看看tqdm的进度条效果: tqdm安装:

  • Jquery Easyui进度条组件Progress使用详解(8)

    本文实例为大家分享了Jquery Easyui进度条组件的实现代码,供大家参考,具体内容如下 加载方式 Class加载 <div class="easyui-progressbar" data-options="value:60" style="width:400px;"> </div> JS调用加载 <div id="box" style="width: 400px;">

  • Android编程自定义进度条颜色的方法详解

    本文实例讲述了Android编程自定义进度条颜色的方法.分享给大家供大家参考,具体如下: 先看效果图: 老是提些各种需求问题,我觉得系统默认的颜色挺好的,但是Pk不过,谁叫我们不是需求人员呢,改吧! 这个没法了只能看源码了,还好下载了源码, sources\base\core\res\res\ 下应有尽有,修改进度条颜色只能找progress ,因为是改变样式,首先找styles.xml 找到xml后,进去找到: <style name="Widget.ProgressBar"&

  • NProgress显示顶部进度条效果及使用详解

    NProgress实现显示加载进度条效果,具有逼真的动画涓涓细流来说服你的用户,无页面跳转效果 ,极大提高用户体验效果 1. 官网下载地址 实现效果如下GIF图片所示:(请求的数据比较小,所以跑得比较快,可以开发者工具Network设置为3G以下网速看得更清晰点) 2. 引入需要的 nprogress.css 和 nprogress.js 文件 <link rel="stylesheet" type="text/css" href="nprogres

  • vue视频时间进度条组件使用方法详解

    本文实例为大家分享了vue视频时间进度条组件的使用方法,供大家参考,具体内容如下 有些视频是以视频流的形式进行渲染的,没有视频滚动条,所以就写了24h的时间组件 实现思路: 1.24h的时间刻度线总宽度为12960px2.点击24h线的某一点,获取这一点离左侧原点的距离(使用dom元素layerX和offsetLeft综合判断)3.计算点击时线段的占比比率4.每天的时间是86400000毫秒5.占比比率乘以86400000就是获取的你点击的时间 代码如下: <template>   <d

  • swift语言Codable 用法及原理详解

    目录 Codable Codable 的用法 JSON 和 模型的相互转换 解码(JSON Data -> Model): 编码(Model -> JSON Data): Codable 支持的数据类型 基础数据类型 Date 嵌套对象 枚举 自定义 CodingKeys Codable 的原理 Decodable 协议 Container 核心原理分析(Container <--> JSON) JSONDecoder 的解码过程 编译器帮我们做了什么? 默认值问题 属性包装器 @

  • 前端开发之CSS原理详解

    前端开发之CSS原理详解 从事Web前端开发的人都与CSS打交道很多,有的人也许不知道CSS是怎么去工作的,写出来的CSS浏览器是怎么样去解析的呢?当这个成为我们提高CSS水平的一个瓶颈时,是否应该多了解一下呢? 一.浏览器的发展与CSS 网页浏览器主要通过 HTTP 协议连接网页服务器而取得网页, HTTP 容许网页浏览器送交资料到网页服务器并且获取网页.目前最常用的 HTTP 是 HTTP/1.1,这个协议在 RFC2616 中被完整定义.HTTP/1.1 有其一套 Internet Exp

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • Java并发编程深入理解之Synchronized的使用及底层原理详解 下

    目录 一.synchronized锁优化 1.自旋锁与自适应自旋 2.锁消除 逃逸分析: 3.锁粗化 二.对象头内存布局 三.synchronized锁的膨胀升级过程 1.偏向锁 2.轻量级锁 3.重量级锁 4.各种锁的优缺点 接着上文<Java并发编程深入理解之Synchronized的使用及底层原理详解 上>继续介绍synchronized 一.synchronized锁优化 高效并发是从JDK 5升级到JDK 6后一项重要的改进项,HotSpot虚拟机开发团队在这个版本上花费了大量的资源

随机推荐