说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的就是我们今天要说的进度条,进度条的模拟实现是挺简单的,但是要做的比较实用还是需要注意很多地方的,下来我就一步步的深入分析一下进度条得实现。

1.起初写下了这样的代码,解释以下几点:

    1>首先我们需要将[ ]固定在左右两边,中间预留下空间,然后用“=”进行填充。这里printf("[%-100s]\r",str);           格式化输出,‘-’表示左对齐,100表示固定列宽,然后‘\r’ 表示回车,即每次打印完使光标回到最开始位置           再明确一下,‘\n’和‘\r’这两个概念:

       ‘\n’表示换行,换到当前行的下一行,即光标指向下一行最开始的位置;'\r'指回车,即光标回到最开始位置。

    2>如果不加睡眠时间,结果一下就全打印出来了,但我们想让它稍微慢一点,毕竟是进度条嘛,而Linux系           统下默认sleep时间单位为秒(s),这样的话又觉得间隔时间太长了,于是就有了usleep,它是以微妙计的,           其头文件在#include <unistd.h>下,这些信息不明白了就man一下;

    3>如下代码我们在观察现象时会发现是隔0.1s在显示,但是它却是一段一段显示的,这就让人很是郁闷了,           最后才发现是printf的原因,printf是先将要输出的内容写到缓冲区里,然后再刷新。


    首先介绍一下UNIX里面关于标准IO的几种缓冲机制:

<3.1>全缓冲 ,全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实              施全缓冲。

<3.2>行缓冲,在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。

     <3.3>无缓冲,无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。


  printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
    (1)缓冲区填满;
    (2)写入的字符中有‘\n’ ,'\r';
    (3)调用fflush手动刷新缓冲区;
    (4)调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
    满足上面4个条件之一缓冲区就会刷新
下面是代码实现:

看一下效果图:

2.知道了上面按一段一段显示的原因,下面我们就来改进一下它,通过fflush这个函数就可以解决这个问题。

fflush用于清空缓冲流,这样就会立刻输出所有在缓冲区的内容,也就能即时刷新,这样刚好就满足了进度条的实时性。


下面是效果展示:


3.上面基本达到了我们想要的效果,但是还是不好,在你下载文件的时候人家就有一个百分比来提示你下载了多少了,而我们这只有一个进度条,前进了多少还得自己估计,这样多不好啊,所以我们也来实现一下这种方式。


效果图:



4.上面实现的看似都有了该有的效果,但是我们还是会感觉有些欠缺,比如有时候进度条会有停止不前的时候,这个时候我们很难知道程序是在继续运行还是卡住了,下面我通过一种动态旋转的图标对其进行优化。

旋转图标自己可以定,“- \ \ | /”或“| / - \ \”都可以


效果图:



5.最后再提一点,我在运行代码时就用了两个命令,make 和./Proc,那是因为我提前就编写了一个Makefile文件,这样就方便了我们运行代码。

下面就来看一下Makefile文件:



作为一个好习惯,记得每次在执行完./Proc后make clean一下



Linux中实现一个简单的进度条相关推荐

  1. linux怎么创建一个c文件,如何在Ubuntu Linux中创建一个简单的C项目

    描述 步骤1:将VirtualBox安装到您的计算机上 VirtualBox是Oracle的一个产品,允许您运行虚拟机您的计算机意味着您可以在Windows或Apple计算机上运行Linux. 转到h ...

  2. CSS3制作一个简单的进度条

    这里只是一个小demo,一个用CSS3写的进度条. 如图所示: 具体代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN&quo ...

  3. Java 代码实现一个标准输出的进度条,知识点你知道但并不一定会用

    最近阿粉在折腾一台服务器,折腾的过程中往往会需要安装很多依赖软件,有的是在官网下载压缩包,有的是通过系统命令直接安装,在通过系统命令直接安装的时候,就会有类似下面的进度条出现. 进度条在我们日常使用的 ...

  4. JS简单实现进度条效果

    今天我们来学习一下,用JS来实现简单的进度条效果 首先我们先来到HTML部分 <div class="box1"></div> css部分 .box1{wi ...

  5. Linux中搭建一个ftp服务器详解

    来源:Linux社区  作者:luzhi1024 详解Linux中搭建一个ftp服务器. ftp工作是会启动两个通道: 控制通道 , 数据通道 在ftp协议中,控制连接均是由客户端发起的,而数据连接有 ...

  6. Android花样loading进度条(二)-简单环形进度条

    背景 Android花样loading进度条系列文章主要讲解如何自定义所需的进度条,包括水平.圆形.环形.圆弧形.不规则形状等. 本篇我们从圆形进度条讲起,讲简单形式的环形进度条,只有进度色彩,没有进 ...

  7. 在 Linux 中把一个网页转换成 PDF的技巧介绍

    你如何在 Linux 中把一个网页转换成 PDF?你可以选择使用每个 Linux 发行版上的网页浏览器(GUI),或者使用终端将网页变成 PDF 文件. 在这里,我将提到这两种方法来帮助你完成工作. ...

  8. 用css3简单实现进度条

    2019独角兽企业重金招聘Python工程师标准>>> css3是一个神奇的东西,刚才一时手痒,写了一个很简单的进度条不用js: 直接嵌套一个div,然后设置里面的div用anima ...

  9. linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...

    在Linux系统中使用xkill命令杀掉未响应的进程 我们如何在Linux中杀掉一个资源/进程?很明显我们会找出资源的pid然后用kill命令. 说的更明白一点,我们可以找到某个资源(比如termin ...

最新文章

  1. AGG第二课 代码框架以及命名规则
  2. java reduce.mdn_reduce高级用法
  3. git add -u与-A .三者的区别
  4. POJ - 3322 Bloxorz I(bfs+状态设计)
  5. IoT与大数据 如何激发数字营销最大潜能?
  6. 转义字符html识别吗,HTML_谈谈html转义字符如何通过代码识别,偶尔会在数据中看到诸如#3 - phpStudy...
  7. cms php上传失败,PHPCMSV9无法上传附件,提示空信息的超级bug
  8. oracle clob 导出csv,在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法...
  9. RISC-V_GD32VF103-开发环境搭建和使用
  10. 四叶草efi_Clover EFI bootloader for Mac(四叶草启动引导工具)
  11. 【深度学习案例】手写数字项目实现-1.数据集介绍
  12. 如何升级到 macOS Mojave
  13. php文字转换为图片,图片转换成文字 把图片转换成可以编辑的文字,图片文字转换成文本文字的方法...
  14. 浅谈润乾报表与QlikView对比
  15. EasyExcel快速上手
  16. 关于鼠标右键无法正常加载一直转圈
  17. 循环函数:while循环和for循环及函数定义
  18. 一个显示农历的日历小程序
  19. 政企采购的概念界定和主要方式
  20. [原创] 利用busybox, extlinux 在工控机CompactFlash(CF卡)上构建Linux系统(上)

热门文章

  1. ERDAS IMAGINE 9.2进行遥感影像融合
  2. 【转】关于Alipay支付宝接口(Java版)
  3. VLC-基于LIBVLC播放视频
  4. 体积光,体积雾——链接
  5. Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be ope
  6. 占书明:outlook发邮件时提示“出现意外错误”的原因及解决办法!
  7. ftl模板生成的word文档打不开
  8. Linux下的常见指令以及权限理解(下)
  9. web应用商城部署(gpmall)
  10. 利用苏宁API接口获取北京时间授时