【Linux】写一个简单的进度条
来源:互联网 发布:网络水军如何找站 编辑:程序博客网 时间:2024/05/21 04:21
一、前言
为什么要写一个进度条呢?其实就是想通过这个来说明两个问题,一个是printf函数缓冲区的问题,一个是'\n','\r'的区别。那么我们先来弄清楚这两个问题。
二、printf缓冲区
我们知道,输出到屏幕相当于访问外设,而外设的速度和内存的速度是相差甚远的,如果每次输出都直接去访问外设,一定会造成效率的下降,所以,printf设置了三种缓冲方式。
1.全缓冲,即整个缓冲区满才会输出到外设。
2.行缓冲,即写满一行输出到外设
3.无缓冲,不用等待,实时的输出。
进度条是需要实时显示当前状态的,所以,需要无缓冲方式,而printf在不加\n或者\r的情况下是不会进行刷新的,那显示器就不会显示当前进度条的状态,根据进度条需要,加换行符也是不合理的,所以需要强制刷新。使用fflush()函数。我们在Linux下用man fflush指令查看一下这个函数:
如图,它的参数是一个文件流。这里又要提到在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,即:stdout, stdin, stderr分别是标准输出,标准输入和标准错误。这里fflush()函数的参数指的就是这三种。我们今天是要输出到屏幕,故要刷新的是stdout。
三、'\n'和'\r'的区别。
我们都知道'\n'是换行符,'\r'是回车符,很多时候会把它和键盘上的Enter键的功能混淆,其实Enter键就相当于'\n'+'\r'。\r是把光标移到行首,'\n'是把光标移到下一行。
我们的进度条每次状态改变的时候需要光标移到行首重新打印。故用到的是'\r'。
四、进度条的实现
1 #include<stdio.h> 2 #include<unistd.h> 3 void bar() 4 { 5 char arr[102]; 6 arr[0]='\0'; 7 int reg=0; 8 char brr[]="-\\|/"; 9 while(reg<=100) 10 { 11 12 printf("[%-100s][%c%%]",arr,brr[reg%4]); 13 printf("\r"); 14 fflush(stdout); 15 arr[reg]='='; 16 reg++; 17 arr[reg]='\0'; 18 usleep(10000); 19 20 } 21 } 22 23 int main() 24 { 25 bar(); 26 return 0; 27 28 }
解释一下这里的%-100s,%s是按字符串格式输出,-100的意思就是预留出100个空间。
0 0
- 【Linux】写一个简单的进度条
- 【Linux】 写一个简单的进度条
- 用js写一个简单的进度条
- js写一个简单的进度条加载
- linux中实现一个简单的进度条
- Linux中实现一个简单的进度条
- 用linux实现一个简单的进度条
- Linux中实现一个简单的进度条
- Linux编写一个简单的进度条
- Linux下编写一个简单的进度条
- 如何在控制台写一个简单的进度条
- 一个简单的进度条
- 【Linux】Linux下实现一个简单的进度条程序
- Linux环境下写一个进度条
- Linux-用shell脚本写一个进度条
- 在Linux环境下编写一个简单的进度条
- 一个简单的进度条ProgressBar
- 实现一个简单的进度条
- windows下编译xv6
- 拓展篇:注解处理器最佳实践
- 30. Substring with Concatenation of All Words
- Python: TypeError: XXX() takes exactly 1 argument (2 given)
- 17 - 01 - 12 计算机网络(02)(协议概述)
- 【Linux】写一个简单的进度条
- LeetCode 021. Merge Two Sorted Lists
- asp为啥取不到request.QueryString的值
- 76. Minimum Window Substring
- 判断链表是否有环,如果有返回入环的第一个节点。
- iOS 怎么将自己创建的一个对象存入数据库sqlite,例如:Person??
- LeetCode 066. Plus One
- win7 安装SQL Server2008R2 提示文件格式错误的处理
- bzoj 4730: Alice和Bob又在玩游戏 线段树合并&博弈论