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

我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在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. word粘贴图片+的editor

    公司做的项目需要用到文本上传功能. Chrome+IE默认支持粘贴剪切板中的图片,但是我要粘贴的文章存在word里面,图片多达数十张,我总不能一张一张复制吧? 我希望打开文档doc直接复制粘贴到富文本 ...

  2. CMake和静态库顺序

    目录 目录 1 前言 1 方法 1 附1:链接静态库的顺序问题 2 附2:再议GCC编译时的静态库依赖次顺问题 3 附3:gcc链接参数--whole-archive的作用 4 附4:让有些“-l”链 ...

  3. 利用tcpcopy引流过程

    tcpcopy是一个tcp流量复制工具,当前还支持udp和mysql流量的复制. 目的: 将机器10.24.110.21的5000端口流量引流到机器10.23.25.11的5000端口. 示例:将10 ...

  4. C#重点内容之:事件(Event)

    一.事件的五个组成部分 事件的五个部分: 事件拥有者(对象) 事件成员(Event ,成员) 事件的响应者(对象) 事件处理器(成员,本质是一个回调方法) 事件订阅——把事件处理器与事件关联在一起 二 ...

  5. 1098 Insertion or Heap Sort

    1098 Insertion or Heap Sort (25 分) According to Wikipedia: Insertion sort iterates, consuming one in ...

  6. noip第8课资料

  7. Codeforces822 C. Hacker, pack your bags!

    C. Hacker, pack your bags! time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  8. hdu2710 Max Factor

    题目 //下面这个是最先用的方法,因为学姐先讲完这个,所以懒得写代码,就将就着这个用,结果搞了老半天,还是错了,心累.. #include<stdio.h> #include<str ...

  9. C - Roll-call in Woop Woop High

    Description The new principal of Woop Woop High is not satisfied with her pupils performance. She in ...

  10. 多条件情况查询,sql select case when when else

    多条件情况查询 SELECT      Title,     'Price Range' =     CASE         WHEN price IS NULL THEN 'Unpriced'   ...