通过实现Linux下的进度条引发的一系列问题

Linux下实现进度条

代码如下:

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 void Progess()
  4 {
  5         char arr[101];
  6         memset(arr,‘\0‘,sizeof(arr)/sizeof(char));
  7         char state[5]="|/-|\0";
  8         int i=0;
  9         for(i=0;i<100;++i)
 10         {
 11                 arr[i]=‘*‘;
 12                 printf("[%-100s][%d%%][%c]\r",arr,1+i,state[i%4]);
 13 
 14                 usleep(100000);//us
 15                 fflush(stdout);
 16         }
 17         printf("\n");
 18 
 19 }
 20 int main()
 21 {
 22         Progess();
 23         return 0;
 24 }

实现进度条需要熟悉下面的几个知识点

1、\r

以\r为输出控制符

运行结果:

很明显,没有输出结果。

在第一行输出后面增加一句输出

输出结果:

给第二行输出加\n

输出结果:

此时可以看到第二行将第一行输出覆盖

此时给给第一个输出加上\n

输出结果:

由以上程序可以看出,

回车换行(\n):每次光标移到下一行的行首位置处;

换行(\r):每次光标移到本行的行首位置处

在输入\r,光标将移动到行首,输入\n光标换行并且移动到下一行行首,相当于\n\r。所以我们在程序中加入了一句fflush(stdout)来保证程序可以输出效果,未加fflush(stdout)时,程序依然能输出结果,但是结果显示是在缓冲区满时才刷新一次。

2、行缓冲区、fflush

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

1 缓冲区填满

2 写入的字符中有‘\n’ ‘\r‘

3 调用fflush手动刷新缓冲区

4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

满足上面4个条件之一缓冲区就会刷新,,也就是printf会真正调用write来写入

当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。

输出结果

在程序运行时因为加入了延时,输出结果并不是一个一个字符输出,而是一次输出1024个字符,从而证明行缓冲区大小为1024个字节。

3、sleep,usleep

也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的Sleep()函数是以毫秒为单位的,sleep(1000);才是休眠1秒。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec)。

时间: 2024-10-19 12:21:28

通过实现Linux下的进度条引发的一系列问题的相关文章

Linux下实现进度条并且彩色打印

Linux下实现进度条并彩色打印 一.为什么要实现一个进度条? 首先就是简单 ( ^_^ ) 其次就是理解以下几个知识点: 1. ' \r ' 与 '  \n ' 的区别 先来看下什么是缓冲区:暂时存放输入输出信息的地方 \r:将要输入输出的信息会覆盖缓冲区原有的信息 \n:先进行输入输出信息,再换行,最后刷新缓冲区 2. usleep函数 作用:把调用该函数的线程挂起一段时间,单位是微秒 头文件:#include <unistd.h> 语法:void usleep( int micro_se

Linux下简易进度条的实现

在生活中,进度条是很常见的,那么,进度条是如何实现的呢? 首先,进度条的动态是利用人眼视觉暂留效果的.实际上是如下过程: 先输出:[=                                               ]表示进度是1%,刷新之后 再输出:[==                                             ]......由于刷新的很快,所以看起来像是等号不断向后增加,直到进度完成. 在写这个程序之前我们需要了解一下的知识: 1.缓冲区 缓冲区分

Linux下的进度条小程序

本文的题目就是实现一个进度条,进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否. 那么 ,一个进度条有哪些元素呢: 一个不断向右生长的容器(直观的看出当前的进度) 一个数据化反映进度的百分比. 一个标志(这个标志反映这个进度条是否在工作,还是卡死) 在这里有一些小小的知识点:C语言中缓冲区的刷新方式是以行缓冲刷新的.也就是说,程序要在输入流中取到一个行结束标志(可以是换行符和EOF)才会显示在输出设备(屏幕)上.注意,程序结束时,系统会强制刷

shell下的进度条和最大最小平均值

进度条 C语言下的进度条参考我原来的一篇blog->进度条 function proc() {      i=0       str=''      arr=('|' '/' '-' '\\')      index=0      while [ $i -le 100 ]      do          printf "[%-101s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}"

C# 模式窗口下更新进度条

public partial class frmProcessBar : Form { public frmProcessBar() { InitializeComponent(); } public bool Increase(int nValue) { if (nValue > 0) { if (progressBar1.Value + nValue < progressBar1.Maximum) { progressBar1.Value += nValue; return true; }

Linux学习之进度条设计progressBar

进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务量的大小,和可能需要处理时间,一般以长方形条状显示. #include<stdio.h> #include<stdlib.h> void progressBar() { char buffer[21]={0}; int count=0; int i=5; while(count!=20) { i=5; while(i--) buffer[count++]='#'; printf("%-

linux 下的50条命令

文件和目录的基本操作 1   mkdir命令: 创建目录 1.1   mkdir -p \data\jxm\    -p 创建递归目录 2   touch命令:创建文件 2.1  touch 1.txt  表示创建文件. 3   cp:拷贝命令      3.1   cp -r /data/jxm/ ./ -r 连同目录一起拷贝 4   mv: 移动文件     4.1   mv/data/test.txt /home/  将test文件移动到/home/下 4.2   mv test.txt

由linux下的多进程编程引发的关于进程间隔离的思考

源代码放到了三个文件中: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> includeall.h #include "includeall.h" int my_sum(int a,int b)//calculate the sum from a to b { int

linux脚本显示进度条

环境Centos 6.6 [[email protected] ~]# cat jindutiao.sh  #!/bin/sh b='' for ((i=0;$i<=100;i+=2)) do         printf "progress:[%-50s]%d%%\r" $b $i         sleep 0.1         b=#$b done echo [[email protected] ~]# 效果图: