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

我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在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;
}

效果图如下:

linux下实现进度条小程序的更多相关文章

  1. Winfrom 简单的进度条小程序

    使用Winform空间编写简单的进度条小程序: 所需控件:Lable 标签  TextBox  文本框  progressBar  进度条控件  timer 定时器 下面是源码及效果图: /// &l ...

  2. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  3. Linux下简易进度条的实现

    在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=                                  ...

  4. Python实现进度条小程序

    一.print()参数介绍 1.end:指定打印结束后添加的字符,默认值为换行符 for j in range(3): print('hello world') for i in range(3): ...

  5. Linux下提权常用小命令

    有些新手朋友在拿到一个webshell后如果看到服务器是Linux或Unix操作系统的就直接放弃提权,认为Linux或Unix下的提权很难,不是大家能做的,其实Linux下的提权并没有很多人想象的那么 ...

  6. Linux下使用vim编辑C程序

    这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...

  7. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  8. linux 下检查java jar包 程序是否正常 shell

    linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...

  9. Linux下如何让jar包程序在后台一直执行

    Linux下如何让Jar包程序在后台一直执行 shell命令 nohup java -jar xxx.jar & &:让程序后台执行. nohub:让程序控制台输出转移到nohub.o ...

随机推荐

  1. CCommandLineInfo类

    ## CCommandLineInfo cmdInfo;//定义命令行 ParseCommandLine(cmdInfo);//解析命令行 // 调度在命令行中指定的命令.如果 // 用 /RegSe ...

  2. 25个Linux相关的网站

    下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章< ...

  3. NodeJs回调操作Promise化

    mongoose是一个NodeJs下MongoDB的ORM库.使用这个库,您从DB到表(collection)都不用创建了.只需要在项目中定义好Model. 下面就是用上一篇的代码来演示如何把mong ...

  4. Java理论学时第三节。课后作业。

    如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算? 运行结果. 根据我的总结,它们三个的优先级是:构造方法 > 字段初始值 > 初始化块. 当多个类之间有继承关系 ...

  5. 20169207《Linux内核原理与分析》第三周作业

    这周主要对于以往的知识进行了复习,包括开始的Linux基础,以及对需要学习的新知识进行了复习,也对markdown的语法进行了初步的了解.开始学习markdown的一些基本语法和Linux的一些常用命 ...

  6. js-实现搜狐列表

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. js加减运算·传参

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  8. C#通过字符串名称来调用对应字符串名称的方法

    前段时间在一个项目中,在一个地方要将函数所在类中的方法都调用一遍,但是否调用要通过配置文件中的内容决定.所以为了减少代码量,在网上查了相关信息,终于成功的将其应用到了项目中,我在这里将我做的一个简单例 ...

  9. MVVM双向绑定实现之Object.defineProperty

    随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在 ...

  10. AJPFX:外汇的技术面分析

    AJPFX平台:开设外汇保证金交易账户以及入金之后,通常就可以开始交易了,但是在选择买卖时点时通常会依据两种分析,两种主要分析方法通常会被称为基本面分析和技术分析.基本面分析注重金融,经济理论和政局发 ...