zoukankan      html  css  js  c++  java
  • 实现一个简单的进度条

       我们平常在下载软件或者安装软件时都会看到进度条,下面我们分析一下,并实现一个简易的进度条

    1、首先我们用[]固定在左右两边,中间预留空间,然后用'='进行填充在这里我们用"="表示1%,通过增加字符

    来保证进度的增加。printf("[%-100s] ",str); 格式化输出。'-'表示左对齐 100表示列宽,' '表示回车,即每

    次打印完使光标回到行首在这里需要解释一下' '和' '这两个概念

    回车:' ',表示回到当前行的行首
    换行:' ',表示光标进入下一行
    2、加睡眠时间,如果不加睡眠时间,结果一下就全打印出来,那就不是进度条了。
    linux下sleep时间单位为秒,这样的话感觉间隔时间有点长,于是又有了usleep函数
    我们可以通过man 来查看这连个函数:

    3、在观察程序输出结果是会发现它是一段一段显示,这和我们平常见到的
    进度条不一样。究其原因,发现是printf()的原因,,printf是先将要输出的内容

    写到缓冲区里,然后再刷新。

    现在来看一下UNIX里面关于标准IO的几种缓冲机制:
    <1>全缓冲:指的是系统在填满标准IO缓冲区之后,才进行实际的IO操作
    ;磁盘上的文件通常由标准IO库实施全缓冲
    <2>行缓冲:标准IO在输入输出时遇到换行符( )的时候才将缓冲区的内容
    写入到标准输入输出的磁盘文件。注意:当流涉及到终端时
    通常使用的是行缓冲
    <3>无缓冲:指的是标准IO库不对字符进行缓冲存储,
    注意:标准出错流stderr通常是无缓冲。

    printf()是一个行缓冲函数,先写到缓冲区中,满足刷新条件才将缓冲区的内容刷新到对应的文件中
    ,刷新缓冲区的条件如下:
    (1)缓冲区已满;
    (2)遇到 ;
    (3)调用ffush手动刷新缓冲区;
    (4)调用scanf()从缓冲区读取数据时,也会将缓冲区的数据刷新;
    满足上面的任意一个条件缓冲区就会刷新
    代码如下:

     1 void Proc()
     2 {
     3   int rate = 0;
     4   char str[102] = {0};
     5   const char* arr = "-\|/";
     6   while(rate<=100)
     7   {
     8       str[rate]='=';
     9       printf("[%-100s],%d%% ,[%c]
    ",str,rate,arr[rate%4]) ; //%d%%d 打印百分比%%也可以用\%代替
    10       rate++;
    11      fflush(stdout);
    12        usleep(1000000);
    13    }
    14 }
    15 int main()
    16 {
    17     Proc();
    18   return 0;
    19 }


    效果展示:

    4.最后补充一点,编写Makefile文件

      
     直接输入make 就会生成Proc文件
     执行程序命令 ./Proc
     执行完之后记得清理解决方案

  • 相关阅读:
    服务列表
    Tinyfool的2013年总结————在困惑和挣扎中试图前行
    支付平台程序,支付程序,网络pos程序,api接口程序,锋锐支付平台程序开发领导者!
    是新浪移动云
    Convert SVG to PNG in Python
    qrcode 4.0.4 : Python Package Index
    CairoSVG
    cairo graphics.org
    The Apache™ Batik Project
    Online SVG to PNG/JPEG/TIFF conversion
  • 原文地址:https://www.cnblogs.com/xmc2017/p/6277482.html
Copyright © 2011-2022 走看看