Linux -- 进度条小程序

目录

一、缓冲区

二、回车与换行

三、进度条

1、版本一

2、版本二


在写小程序之前先来了解两个知识点

一、缓冲区

缓冲区(buffer),它是内存空间的一部分。也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或者输出的数据,这部分预留的空间就叫做缓冲区,显然这种缓冲区是具有一定大小的。

缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

接下来我们用一段简单的代码看下缓冲区在代码中的作用

这段代码的结果是程序会休眠3秒,然后再打印字符串you can see me之后结束运行。

为什么会出现这种情况,不应该是打印字符串后再休眠3秒吗?

这是因为在执行printf时,字符串被写入到了C程序的缓冲区里,但并没有输出到显示器上,执行完sleep后,缓冲区的内容才被刷新到显示器上。

这就得了解下缓冲区刷新的规则:

  • 行刷新
  • 程序结束
  • 强制刷新

上面示例的情况属于程序结束时刷新 ,但如果在字符串后面加上'\n' 就属于行刷新。

补充:

这里要介绍一个接口函数:fflush -- 强制刷新(刷新一个流)

c语言在打开时会默认打开三个流:stdin、stdout、stderr

所以如果想要显示所输入的字符串,可以使用fflush来强制刷新stdout

二、回车与换行

回车:换到当前行的开头

换行:换到当前光标对应的下一行的位置

'\n' --> 回车 + 换行

'\r' --> 回车

三、进度条

1、版本一

头文件

复制代码
  1 #pragma once 
  2 
  3 #include<stdio.h>
  4 #include<unistd.h>
  5 #include<string.h>
  6 #include<time.h>
  7 #include<stdlib.h>
  8 
  9 #define NUM 103
 10 #define Body '='
 11 #define Head '>'
 12 
 13 
 14 typedef void (*callback_t)(double);                                                                                                          
 15 
 16 //version1
 17 void process();

源文件

复制代码
#include"processbar.h"                                                                                                                       
  2 
  3 
  4 const char *lable="|/-\\";
  5 
  6 //version1
  7 void process()
  8 {
  9     //const int n = 101;
 10     //char buffer[n]; //C语言是编译不通过的
 11     
 12     char buffer[NUM];
 13     memset(buffer, '\0',sizeof(buffer));
 14     int cnt = 0;
 15     int n = strlen(lable);
 16     buffer[0] = Head;
 17     while(cnt <= 100)
 18     {
 19         printf("[%-100s][%3d%%][%c]\r", buffer, cnt, lable[cnt%n]);
 20         fflush(stdout);
 21         buffer[cnt++] = Body;
 22 
 23         if(cnt < 100)
 24             buffer[cnt] = Head;
 25 
 26         usleep(100000);
 27     }
 28 
 29     printf("\n");
 30 }

结果:

2、版本二

由于一个真正的进度条不是一个独立的程序,而是要依附于其他程序才能实时显示进度。

但是在写程序之前,我们要讲两个知识点:回调函数和函数指针

在了解到这两个知识点后,我们就用三个文件来实现版本2的进度条

main.c:调用

processbar.c:实现

processbar.h:声明

结果:

相关推荐
姜鱼问生5 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存
Apipi*6 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP7 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
运维行者_7 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
此时不提桶,更待何时8 小时前
06-14-A-Kafka集群运维与迁移实战详解
运维·kafka
qq_284274058 小时前
机械原理笔记:平面机构自由度计算(复合铰链、局部自由度、虚约束)与四杆机构入门(含考点)
笔记·学习·平面·自动化·制造
hz567899 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC9 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
优橙教育9 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
qq_284274059 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造