[Linux入门]---Linux第一个小程序-进度条

文章目录

1.倒计时程序

在学习Linux进度条程序之前,我们可以再学习另一个更简单小程序---倒计时!

\r&&\n

平时我们电脑的时候都会使用到键盘,既然使用到键盘,那就必不可少地会使用到Enter键,也就是我们所说"回车键",其实发生了两个动作:回车'\r(光标回到行首),换行'\n'(光标换到下一行),Enter键即为回车换行键!平时在写C语言程序时,输出函数中'\n'(回车符)也默认了回车换行两个动作!

老式键盘

现代键盘

缓冲区

在编译器中,我们有stdin(标准输入流),stdout(标准输出流),stedrr(标准错误流),每个标准流缓冲区;以标准输出流stdout为例,使用printf函数输出时,会将输出的数据放到输出缓冲区,刷新输出缓冲区,即将输出缓冲区的数据输出stdout流(显示器)中,此时我们才可以看到输出的数据!

eg1:

cpp 复制代码
//在gcc编译器下的代码
#include<unistd.h>
int main()
{
    printf("hello world");
    sleep(2);
    return 0;
}

代码运行的结果:

eg2:

cpp 复制代码
//在gcc编译器下的代码
#include<unistd.h>
int main()
{
    printf("hello world\n");
    sleep(2);
    return 0;
}

代码运行的结果:

代码1的printf函数中没有'\n',sleep函数(休眠函数)让程序休眠2秒,之后程序结束才能刷新缓冲区,将"hello world"输出到显示器;代码2的printf函数中有'\n',会将刷新缓冲区,将"hello world"输出到显示器,sleep函数(休眠函数)让程序休眠2秒才结束。

倒计时程序

学习自动化构建工具,我们可以创建文件makefile文件,向文件输入相应的指令!

指令如下:

cpp 复制代码
test:main.c prosserBar.c
        gcc -o $@ $^
.PHONY:clean
clean:
        rm -rf test

prosserBar.c文件实现倒计时代码,在prosserBar.h头文件中声明,在main.c文件进行函数调用。

cpp 复制代码
//
#include"prosserBar.h"
void countdown()
{
    int cnt=10;//倒计时
    while(cnt>=0)
    {
        printf("%-2d\r",cnt);
        fflush(stdout);
        cnt--;
        sleep(1);//睡眠函数
    }
    printf("\n");
}

Xshell代码演示结果:

printf("%-2d\r",cnt);%-2d输出的数字进行向左对齐,\r光标在该行的行首,ffloush(stdout);刷新缓冲区,在显示屏输出数字,使用sleep(1);停顿一秒再进行下一个数字输出,从而达到停顿的效果。

2.进度条

prosserBar.h文件

cpp 复制代码
#pragma once                                                                 
#include<stdio.h>                                                                                     
#include<string.h>                             
#include<unistd.h>                                                                                   
#define NUM 102                                                                    #define TOP 100                                                                      
#define BODY '='                                                                                
#define RIGHT '>'                                                                                                                                     
//进度条                                                            |~
void prosser(int speed);  

prosserBar.c文件

cpp 复制代码
void prosser(int speed)                                                           
{   
	const char* label="|/-\\";                                                                                
    char bar[NUM];                                                                
    memset(bar,'\0',sizeof(bar));                                                 
    int cnt=0;                                                                    
    int sz=strlen(label);                                                         
    while(cnt<=TOP)                                                               
    {                                                                             
    printf("[%-100s][%d%%][%c]\r",bar,cnt,label[cnt%sz]);/// 没有\n,就没有立即刷新,因为显示器模式是行刷新    
    fflush(stdout);    
    bar[cnt++]=BODY;    
    if(cnt<=100)    
    {    
      bar[cnt]=RIGHT;    
    }     
    usleep(speed);    
    } 
    printf("\n");   
} 

①定义一个进度字符数组bar初始化为'0'和一个转动字符数组label并计算其长度为len;②在printf函数中使用[%-100s][%d%%][%c]预留一定空间,'\r'会将输出的光标回到行首,fflush(stdout);都刷新缓冲区;③bar[cnt++]=BODY;打印一次存放一个进度符号,模拟进度效果;④使用bar[cnt]=RIGHT; 达到进度条推进效果,直到进度条为满的状态(if语句实现);⑤ iusleep(speed);模拟某项工作所要花费的时间。

Xshell演示效果为:

相关推荐
牧以南歌〆1 小时前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
九年义务漏网鲨鱼1 小时前
【大模型学习 | MINIGPT-4原理】
人工智能·深度学习·学习·语言模型·多模态
The_era_achievs_hero1 小时前
微信小程序71~80
微信小程序·小程序
jz_ddk2 小时前
[学习] C语言数学库函数背后的故事:`double erf(double x)`
c语言·开发语言·学习
夜月yeyue2 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
kfepiza2 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
爱莉希雅&&&3 小时前
技术面试题,HR面试题
开发语言·学习·面试
!win !3 小时前
被老板怼后,我为uni-app项目引入环境标志
前端·小程序·uni-app
cuijiecheng20183 小时前
Ubuntu下布署mediasoup-demo
linux·运维·ubuntu
Chef_Chen4 小时前
从0开始学习计算机视觉--Day08--卷积神经网络
学习·计算机视觉·cnn