专栏首页从零开始学 Web 前端linux下实现进度条小程序

linux下实现进度条小程序

转载自:实现一个简单的进度条

我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在linux下实现这个进度条的功能。

1、我们使用的关键打印语句是printf函数:

printf("[%-100s] [%d]%% [%c]\r");

其中,'-'表示左对齐 100表示列宽,'\r'表示回车,即每

次打印完使光标回到行首。这样在打印的时候就不会出现打印很多行的情况。 在这里需要解释一下'\r'和'\n'这两个概念: 回车:'\r',表示回到当前行的行首 换行:'\n',表示光标进入下一行


2、加入睡眠时间,否则结果一下子就全部打印出来了,就不是进度条了。 通过man指令我们可以找到sleep和usleep函数。前面延时单位为秒,后置延时单位为微秒,我们这里选择后者。


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

printf函数是一个行缓冲的函数,它会将结果先写到缓冲区,然后满足一定的条件才会刷新到对应的文件中,所以我们看到打印出来的结果是一段一段的,而不是一个一个字符的打印出来,这就是因为行缓冲的原因。

那么我们就有必要使得每打印一个字符刷新到对应的文件中,怎么做呢?

首先我们看下有哪些条件可以刷新缓冲区: (1)缓冲区已满; (2)遇到\n; (3)调用ffush手动刷新缓冲区; (4)调用scanf()从缓冲区读取数据时,也会将缓冲区的数据刷新;

这里我们使用fflush来手动刷新缓冲区。

代码如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int rate = 0;
    char buf[101] = {0};
    const char arr[4] = {'-', '\\', '|', '/'}; // 注意:'\'字符的表示
    while( rate <= 100 )
    {
        buf[rate] = '#';
        printf("[%-100s] [%d]%% [%c]\r", buf, rate, arr[rate%4]);
        fflush(stdout);
        rate++;
        usleep(100000);
    }  
    return 0;
}

效果图如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 天了噜,为什么外链css要放在头部,js要放在尾部?

    我们最开始学前端的时候都会看到教程在处理外部css,js的时候会将css放在header中,js放在body的最后。为什么要这样子处理,今天参考一些资料好好分...

    Daotin
  • linux内核移植过程问题总结

    移植内核:2.6.30.4 内核根目录下的.config为当前配置内核的且已经配置好的内核配置。make zImage以此为依据 配置内核的过程: cd lin...

    Daotin
  • Vue服务端渲染和Vue浏览器端渲染的性能对比

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本。网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 v...

    Daotin
  • 一道简单的笔试题_低功耗设计

    降低功耗:应当在所有设计层次上进行,即系统级、逻辑级和物理级,层次越高对功耗降低越有效;

    数字芯片社区
  • OpenCV矩形检测

    今天在52CV交流群里有朋友问到矩形检测的问题,恰好前几天做了一个与此相关的项目,调研了一下相关的算法(期间被某带bug的开源代码坑了很久,为防止大家掉进坑里)...

    CV君
  • 【从零学习OpenCV 4】轮廓外接多边形

    由于噪声和光照的影响,物体的轮廓会出现不规则的形状,根据不规则的轮廓形状不利于对图像内容进行分析,此时需要将物体的轮廓拟合成规则的几何形状,根据需求可以将图像轮...

    小白学视觉
  • 序列周期性与魔术(四)——周期序列数学性质深入探秘

    假设有一个m个人参加,每人依次发牌,每人总共n张牌游戏,总共需要mn张牌,编号为1:mn。任何一个人所发得的牌构成一个牌组(集合),我们只关心其组合,不关心其排...

    magic2728
  • 论程序员的取财之道

    就在这两天,世界互联网大会在乌镇隆重召开,IT圈可是热闹极了。各大老在谈论互联网的同时,也谈论了属于我们的机会。特摘录了下面3...

    业余草
  • office系列文档的在线预览解决方案 - 在linux平台下转为pdf

    office系列文档包括:.ppt .pptx .doc .docx .xls .xlsx 等常用格式。

    王亚昌
  • 5.19 VR扫描:Steam VR新增Home功能,带来全新VR社交体验

    VRPinea

扫码关注云+社区

领取腾讯云代金券