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

我们平常总会在下载东西或者安装软件的时候看到进度条,这里我们就在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. 20169207《Linux内核原理与分析》第九周作业

    第九周的实验依旧和往常的一样,主要包括两部分.一是1.阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第13,14章.二是学习MOOC「Linux内 ...

  2. 移动端 - Android客户端性能测试常见指标

    rom版本的性能测试 一般关注功耗(不过 rom 版本的功耗测试跟应用的功耗测试会有所差异,当然只是用例设计方面的差异,工具仍然采用安捷伦电源仪进行) 应用的性能测试 包括很多测试项,如启动时间.内存 ...

  3. MySQL性能优化之延迟关联

    [背景]  某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下.使用工具查看数据库正在执行的sql ,排在前面的大部分是: SELECT id, cu_id, name, in ...

  4. Apache Flink 漫谈系列

    阿里云讲Flink的,还是蛮不错 https://yq.aliyun.com/articles/666043?spm=a2c4e.11153940.blogcont679659.23.9fae56e7 ...

  5. Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)

    Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...

  6. bootstrap4.2 导航搜索框

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

  7. Ajax登录用户名密码

    <script src="http://code.jquery.com/jquery-latest.js"></script>#引入jQuery#当点击函数 ...

  8. Java学习--基本数据类型的定义和运算2

    例1 public class OperateDemo01{ public static void main(String args[]){ int num = 22 ; System.out.pri ...

  9. cxgrid回车移到下一个单元格

    cxgrid回车移到下一个单元格   cxgrid回车移到下一个单元格 作用:表格式录入全键盘操作. 设置cxgrid1Dbtableview1.optionsBehavior.goToNextCel ...

  10. [LintCode] Permutations

    http://www.lintcode.com/en/problem/permutations/# Given a list of numbers, return all possible permu ...