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 条评论
登录 后参与评论

相关文章

来自专栏我的博客

CI页面乱码

今天项目页面乱码 我确认了数据库读取时utf8,页面也添加 <meta http-equiv=”content-type” content=”text/html...

30860
来自专栏河湾欢儿的专栏

常用的dos命令

10320
来自专栏Laoqi's Linux运维专列

shell 1>&2 2>&1 &>filename重定向的含义和区别

14850
来自专栏小夜博客

LNMP1.3 安装 fileinfo 组件

39690
来自专栏北京马哥教育

Python 的 ImportError 错误

? 问题 错误:ImportError: No module named XXX 在Python的工程中,偶尔会遇到文件无法引用的情况,即PyCharm ID...

24960
来自专栏Java后端技术

解决jetty7.0.pre5启动时报ClassNotFoundException: javax.interceptor.InvocationContext异常的问题

一.背景介绍:最近项目在使用maven命令行运行jetty服务器时出现ClassNotFoundException: javax.interceptor.Inv...

8010
来自专栏ytkah

dedecms建的网站如何去掉/index.html

DEDECMS建立的网站,www.abc.com/index.html和www.abc.com两个都可以访问,而且两个页面都是一样的,这样就会造成重复页面,对搜...

36860
来自专栏Python爬虫与数据挖掘

如何在交互式环境中执行Python程序

相信接触过Python的小伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行、命令行窗口运行、开发工具上运行等,...

15330
来自专栏有趣的django

10.socket网络编程

套接字工作流程 ? 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端...

39170
来自专栏赵俊的Java专栏

Python 文件操作

29530

扫码关注云+社区

领取腾讯云代金券