Linux下彩色进度条

回车与换行

回车(\r):回到当前行行首
换行(\n):换到当前行下一行行首

缓冲区概念

  一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器(内存),或者分段运输区,在这里数据可被存储并在之后用于检索。

  缓冲区可分为:全缓冲,行缓冲,不带缓冲

  1. 全缓冲:当填满标准IO的缓存后才进行实际IO操作。windows和linux都可以通过给 _Mode设为 _IOFBF设置全缓冲。全缓冲的典型就是对磁盘文件的读写。缓冲区为空,一次读满数据,再写出。

  2. 行缓冲:在输入输出遇到换行符时,执行真正的IO操作。linux输出默认是行缓冲,以回车结束。windows没有行缓冲,不能设置,一旦设置变为全缓冲。设置行缓冲为:_IOLBF。这时候输入的字符先存放至缓冲区,等按下回车键时才进行实际IO操作。典型代表就是键盘输入数据,每次读取一行。

  3. 不带缓冲:直接进行实际的输入输出操作。windows默认输出不带缓冲,linux可以设置setvbuf(stdout, NULL, _IONBF, 0)。

缓冲区刷新

  • 对于输出来说,刷新缓冲区就是让缓冲区内内容立即输出
#include <stdio.h>
#include <unistd.h>

int main(){
    printf("hello world!");
    sleep(3);
    return 0;
}

  由于Linux下是行缓冲,所以让它睡眠3秒查看现象,发现hello world!会先输入到缓冲区中,睡眠3秒后输出到显示屏上。

描述

描述

#include <stdio.h>
#include <unistd.h>

int main(){
    printf("hello world!");
    fflush(stdout);
    sleep(3);
    return 0;
}

  如果刷新缓冲区,则会先将hello world!输出到显示屏,然后休眠3秒。

描述

描述

  • 对于输入来说,刷新缓冲区就是将后面的内容抛弃
#include <stdio.h>

int main(){
    char c = getchar();
    printf("%c\n",c);
    c = getchar();
    printf("%c\n",c);
    c = getchar();
    printf("%c\n",c);
    return 0;
}

描述

#include <stdio.h>

int main(){
    char c = getchar();
    printf("%c\n",c);
    c = getchar();
    printf("%c\n",c);
    fflush(stdin);
    c = getchar();
    printf("%c\n",c);
    return 0;
}

描述

彩色进度条

 利用回车概念,实现视觉上的彩色进度条。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(){
    char buf[102] = {0};
    int i = 0;
    int j = 0;
    int color[] = {1, 2, 3, 4, 5, 6, 7};
    const char* lable = "|/-\\";
    for(; i < 101; ++i){
       buf[i] = '#';
       printf("\033[3%dm[%-101s]\033[0m\033[33m[%d%%]\033[0m[%c]\r", color[j], buf, i, lable[i % 4]);
      //每25%换一次颜色
      if(i % 25 == 0){
          ++j;
      }
      fflush(stdout);
      usleep(50000);
    }
    printf("\n");
    return 0;
}

效果如下:

描述

在这里就有一个疑问如何使输出字体带颜色?

  经过查找资料发现只有在输出时候加上 ”\033[ ; m …… \033[0m“即可使得输出的字体和背景是有颜色的。

  常见参数如下:

字背景颜色范围:40 - 49

  • 40:黑
  • 41:深红
  • 42:绿
  • 43:黄色
  • 44:蓝色
  • 45:紫色
  • 46:深绿
  • 47:白色

字颜色:30 - 39

  • 30:黑
  • 31:红
  • 32:绿
  • 33:黄
  • 34:蓝色
  • 35:紫色
  • 36:深绿
  • 37:白色

ANSI控制码:

  • \33[0m 关闭所有属性
  • \33[1m 设置高亮度
  • \33[4m 下划线
  • \33[5m 闪烁
  • \33[7m 反显
  • \33[8m 消隐
  • \33[30m – \33[37m 设置前景色
  • \33[40m – \33[47m 设置背景色
  • \33[nA 光标上移n行
  • \33[nB 光标下移n行
  • \33[nC 光标右移n行
  • \33[nD 光标左移n行
  • \33[y;xH设置光标位置
  • \33[2J 清屏
  • \33[K 清除从光标到行尾的内容
  • \33[s 保存光标位置
  • \33[u 恢复光标位置
  • \33[?25l 隐藏光标
  • \33[?25h 显示光标
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值