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;
}
效果图如下:
- BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)
- 2301: [HAOI2011]Problem b
- mysql相关命令
- mac python3 安装 mysqlclient包失败如何解救
- SQL Server 深入解析索引存储(上)
- 1475: 方格取数
- python3 将字典,列表等转换成字符串形式存入mysql数据库并复原成字典,列表(处理稍复杂的格式)
- 1441: Min
- 2429: [HAOI2006]聪明的猴子
- 使用apt-get 安装后的mysql 登录问题
- SQL Server 深入解析索引存储(中)
- 1789: [Ahoi2008]Necklace Y型项链
- 3399: [Usaco2009 Mar]Sand Castle城堡
- 遗传算法(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- nvm管理工具
- 基于OpenCV的图像卡通化
- shadertoy绘图
- 单基因生信分析流程(6)单基因相似性分析
- 三阴性乳腺癌提取和分析
- 一日一技:更友好的格式化数据提取方案
- 『深度应用』YoloV5 RTX2080Ti TensorRT与PyTorch速度对比
- 0797-使用HDP或CDP的Atlas采集CDH6的元数据和血缘
- 现代通信理论与新技术 PPT笔记整理
- 找找规律——LeetCode题目6:Z字形变换
- 给你点信心——LeetCode题目7:整数反转
- Python -二叉树 创建与遍历算法(很详细,转自国外教程)
- APP流量来源追踪方式——Android篇
- 从浏览器输入网址回车到看到页面过程到底经历了什么?
- Flutter Bloc 官方文档(BlocBuilder翻译)