Linux:进度条程序的详解

进度条

    • 了解知识
        • 换行(\n)和回车(\r)的区别:
        • 缓冲区概念
        • fflush
        • usleep
    • 进度条小程序


了解知识

换行(\n)和回车(\r)的区别:

  • <\r>回车(carriage return):即每次打印完使光标回到最开始位置
  • <\n>换行(line feed):换到当前行的下一行,即光标指向下一行最开始的位置

缓冲区概念

缓冲区分为:无缓冲、行缓冲、全缓冲。

  • 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr。
  • 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作。典型的代表是键盘的操作。
  • 全缓冲:表示的是输入输出写满缓冲区才执行I/O操作。典型的代表是磁盘的读写

关于行缓冲有3个实例:

Linux:进度条程序的详解_第1张图片

现象是什么?

先打印Hello,world! 三秒后换行打印apple@AppledeMacBook-Pro Linux %
在这里插入图片描述

Linux:进度条程序的详解_第2张图片

现象是什么?

停顿3秒后先打印Hello,world!% (这里为啥跑出来了 % 我也不是很懂),再换行打印apple@AppledeMacBook-Pro Linux %

在这里插入图片描述

Linux:进度条程序的详解_第3张图片

现象是什么?

停顿3秒后先打印Hello,world! ,再换行打印%,并换行打印apple@AppledeMacBook-Pro Linux %

在这里插入图片描述

结论:

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

  1. 缓冲区填满;

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

  3. 调用fflush手动刷新缓冲区;

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

满足上面4个条件之一缓冲区就会刷新

fflush

功能: 清除读写缓冲区,在需要立即把输出缓冲区的数据进行物理写入时

  • fflush(stdin):刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]

  • fflush(stdout):刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上

usleep

usleep函数能把进程挂起一段时间, 单位是微秒(千分之一毫秒)。本函数可暂时使程序停止执行。头文件:

进度条小程序

#include 
#include 
#include 

int main(){
	char arr[102] = {0};
	const char* lp = "|/-\\";
	for(int i = 0; i < 100; i++){
		arr[i] = '#';
		printf("[%-100s][%d%%][%c]\r", arr, i+1, lp[i % 4]);
		fflush(stdout);
		usleep(100000);
	}
	printf("\n");
	return 0;
}

代码生成图
Linux:进度条程序的详解_第4张图片


如有不同见解,欢迎留言讨论~~

你可能感兴趣的:(Linux)