当前位置: 首页 > news >正文

[C/Linux练习]进度条小程序

前置知识点

\n\r

\n
换行,但只是垂直向下,并不水平移动。
\r
回车,返回当前行的头部。
光标返回头部后再打印,会从头开始覆盖之前打印在该行的内容。
printf的\n默认解释成换行+回车。
光标是与显示器匹配的,光标在哪里,显示器上的打印就从哪里开始。
\r\n本质上是用于控制光标的位置。
所有printf向显示器打印的内容,都是字符。

缓冲区

例1:

#include<stdio,h>
int main(){
	printf("hello world\n");
	sleep(1);
	return 0;
}

例2:

#include<stdio,h>
int main(){
	printf("hello world");
	sleep(1);
	return 0;
}

例1字符串后跟了 ’ \n ’ ,编译运行,文本会被直接打印出来;
例2字符串后没跟 ’ \n ',编译运行,文本会等待1秒再被打印出来。

1.程序执行默认按顺序结构执行(无判断、循环的情况下),所以printf一定先于sleep执行,但是先执行不代表内容会先显示,printf的确执行了但是没有显示出来,然后执行了sleep休眠。当sleep结束,程序退出时,文本才被刷新出来。
2.执行sleep休眠的时候 ,printf已经执行完打印了,要打印的数据存放在缓冲区。当sleep执行完,程序退出时,缓冲区的数据才被刷新,打印到终端上。
3.’ \n '是行缓冲,行缓冲策略会在遇到换行符时刷新,进而打印。
4.在没有 ’ \n '的情况下刷新——fflush(stdout) 刷新标准输出流。

缓冲区中的内容只有在刷新时才会打印在屏幕上。

代码与运行效果

proc.h

#pragma once 
#include <stdio.h>
             
extern void process();  

main.c

#include "proc.h"

int main(){
	process();                                                                                                     
	return 0;
}

proc.c

#include "proc.h"    
#include <string.h>    
#include <unistd.h>    
    
#define SIZE 102//确保容纳>和\n    
#define STYLE '#'    
#define ARR '>'    
    
void process(){    
  const char *lable = "-+x*";    
  char bar[SIZE];    
  memset(bar,'\0',sizeof(bar));//将bar的元素全部初始化为\0    
  int i=0;    
  while(i<=100){//0%-100%一共循环101次    
    printf("[\033[43;32;32m%-100s\033[0m][%d%%][%c]\r",bar,i,lable[i%4]);//预留100个字符的位置,负号是从左向右(默认是右对齐)。%%比\%更通用。                                                                                              
    fflush(stdout);    
    bar[i++]=STYLE;//第101个#不会被打印出来,因为循环条件不再满足    
    if(i!=100){    
      bar[i]=ARR;    
    }    
    usleep(100000);//usleep单位为微秒    
  }    
  printf("\n");    
} 

运行效果

请添加图片描述

相关文章:

  • 网站制作上网/今天发生的重大新闻
  • wordpress远程特色图/一键注册所有网站
  • 怎样做淘宝券网站/广告软文小故事800字
  • 电子政务与网站建设工作总结/广告公司名字
  • 深圳app开发公司大概/seo优化多久能上排名
  • 建设企业网站个人网银/广州网络推广外包
  • 用Scipy理解Gamma函数
  • 基于二叉树的改进SPIHT算法(Matlab代码实现)
  • 大数据分案例-基于随机森林算法构建返乡人群预测模型
  • 适合编程初学者的开源项目:小游戏2048(安卓Compose版)
  • 数据标注平台(CVAT)安装及踩坑记录
  • 【jQuery】jQuery其他方法
  • SPSS常用的10种统计分析
  • 【TypeScript】TS泛型
  • 【鸟哥杂谈】腾讯云 CentOS8 Linux环境搭建docker
  • Kotlin~策略模式+简单工厂模式消除if else
  • 二十八、Kubernetes中job详解
  • EDA开源仿真工具verilator入门8:verilator 5.0 最新版本仿真玄铁性能对比