C语言写一个终端进度条

C语言写一个终端进度条

这个功能挺简单的,主要有以下两点:

  • 如何获取终端宽度
  • 如何让字符在原地闪烁

如何获取终端宽度

这里用到了设备控制接口函数ioctl(),下面简单的介绍一下这个函数的用法:

ioctl是一个在Unix和类Unix系统中用于设备驱动程序的设备特定操作的系统调用。它的名称代表“输入/输出控制”,但实际上它可以用于任何设备,不仅仅是输入/输出设备。

在C语言中,ioctl函数的原型如下¹:

#include <sys/ioctl.h>
int ioctl(int fd, int cmd, ...);

这里,fd是一个打开的文件描述符,cmd是设备特定的操作命令,后面的可变参数...取决于cmd指定的操作。

ioctl函数执行成功时返回0,失败则返回-1并设置全局变量errno值。可能的错误包括:

  • EBADF: fd不是一个有效的描述符。
  • EFAULT: argp引用了一个无法访问的内存区域。
  • EINVAL: 请求或argp无效。
  • ENOTTY: fd没有与字符特殊设备关联。
  • ENOTTY: 指定的请求不适用于描述符d引用的对象类型。

更详细的内容可以查询man手册或者其他博客!!这个函数还是挺复杂的!

对于判断终端大小的需求,我们有以下的使用方式:

	struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); // 获取终端大小并且存储到w中
    int barWidth = w.ws_col - 10; // 减去10是为了放置越界

winsize这个结构体位于termios.h头文件内

// /usr/include/asm-generic/termios.h
Struct winsize 
{
    unsigned short ws_row;    /* rows, in character */
    unsigned short ws_col;        /* columns, in characters */
    unsigned short ws_xpixel;    /* horizontal size, pixels (unused) */
    unsigned short ws_ypixel;    /* vertical size, pixels (unused) */
}

使用这个结构体记录窗口终端大小。

如何让字符在原地闪烁

要明白这一点,我们首先要知道两个前置知识:

  • printf的输出条件
  • 终端中的光标

printf的输出条件

没错,printf 也有输出条件,如下:

  • 遇到换行符\n
  • 进程终止
  • 遇到fflush函数

单纯的使用printf并不会直接输出到终端上,会先放在缓冲区,只有遇到换行符才会输出!!!

终端中的光标

我们可以通过'\r'来控制缓冲区中的光标,这样,当我们输出进度条之后,光标又会回到进度条最一开始的位置,这样就可以使得进度条看不见了。

如下:

// 光标置于开头
// progressPercent是进程百分比
printf("\r%3d%% [", progressPercent);

整个函数

// 用法,输入进度值(小数)
// 此函数用于输出一次进度条
void printProgress(float progress) {
        struct winsize w;
        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
        int barWidth = w.ws_col - 10; // -10 防止越界

        int progressPercent = (int) (progress * 100.0); // 计算出百分值
        printf("\r%3d%% [", progressPercent);
        int pos = barWidth * progress; // 包含隐式类型转换

        for (int i = 1; i < barWidth; ++i) {
                if (i < pos) {
                        printf("#");
                } else {
                        printf(" ");
                }
                fflush(stdout); // 输出完所有内容后刷新缓冲区,代码执行到这里才会有一次输出
        }
        printf("]"); // 最后补上后面的括号
}

这里再写一个main函数用于测试:

int main() {
    for (int i = 0; i <= 100; ++i) {
        printProgress(i / 100.0);
        sleep(1);
    }
    printf("\n");
    return 0;
}

因为作者在项目开发时使用的是自用的通用头文件,代码中并没有包含头文件,请读者自行添加。

执行效果

vscode执行效果:
执行效果1
ssh客户端执行效果:
执行效果2
读者可以给进度条加以改进,作为下层代码,方便在上层代码上调用(例如文件传输C/S)。

:wq 拜拜~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/590338.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎样通过Java语言实现远程控制8路控制器/断路器

怎样通过Java语言实现远程控制8路控制器/断路器呢&#xff1f; 本文描述了使用Java语言调用HTTP接口&#xff0c;实现控制8路控制器/断路器&#xff0c;支持8路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多&#xff0c;各种数据都在迅速增加&#xff0c;并且数据的读取流量也大大增加&#xff0c;就面临着数据安全问题&#xff0c;…

手把手教你实现通讯录

整体构思 我们现在要实现一个通讯录 它应该有以下的功能 通讯录可以用来存储1000个人的信息&#xff0c;每个人的信息包括&#xff1a;姓名、性别、年龄、电话、住址 提供方法&#xff1a; 1.添加联系人信息 2.删除指定联系人信息 3.查找指定联系人信息 4.修改指定联系人信…

如何删除BigKey2

例2&#xff1a;假如有hash类型的key&#xff0c;其中有100万对field和value&#xff0c;field是自增id&#xff0c;这个key存在什么问题&#xff1f;如何优化&#xff1f; keyfieldvaluesomeKeyid:0value0..........id:999999value999999 存在的问题&#xff1a; hash的ent…

BJFUOJ-C++程序设计-实验2-类与对象

A 评分程序 答案&#xff1a; #include<iostream> #include<cstring>using namespace std;class Score{ private:string name;//记录学生姓名double s[4];//存储4次成绩&#xff0c;s[0]和s[1]存储2次随堂考试&#xff0c;s[2]存储期中考试&#xff0c;s[3]存储期…

机器学习:深入解析SVM的核心概念【二、对偶问题】

对偶问题 **问题一&#xff1a;什么叫做凸二次优化问题&#xff1f;而且为什么符合凸二次优化问题&#xff1f;**为什么约束条件也是凸的半空间&#xff08;Half-Space&#xff09;凸集&#xff08;Convex Set&#xff09;半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

使用Colab的高RAM模式

使用Colab的高RAM模式 colab需要升级为pro或者pro会员 1. 购买pro 图片来源&#xff1a;https://blog.csdn.net/javastart/article/details/138094086 2. 打开高RAM模式 要在Colab上使用高RAM模式来运行模型计算&#xff0c;您需要按照以下步骤操作&#xff1a; 打开您的…

Deep Learning Part Five RNNLM的学习和评价-24.4.30

准备好RNNLM所需要的层&#xff0c;我们现在来实现RNNLM&#xff0c;并对其进行训练&#xff0c;然后再评价一下它的结果的。 5.5.1 RNNLM的实现 这里我们将RNNLM使用的网络实现为SimpleRnnlm类&#xff0c;其层结构如下&#xff1a; 如图 5-30 所示&#xff0c;SimpleRnnlm …

调教AI给我写了一个KD树的算法

我不擅长C&#xff0c;但是目前需要用C写一个KD树的算法。首先我有一份点云数据&#xff0c;需要找给定坐标范围0.1mm内的所有点。 于是我开始问AI&#xff0c;他一开始给的答案&#xff0c;完全是错误的&#xff0c;但是我一步步给出反馈&#xff0c;告诉他的问题&#xff0c;…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…

【模板】二维前缀和

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 二维前缀和&#xff1a;pre[i][j]a[i][j]pre[i-1][j]pre[i][j-1]-pre[i-1][j-1]; 子矩阵 左上角为(x1,y1) 右下角(x2,y2…

自然语言处理基础

文章目录 一、基础与应用简单介绍基本任务重要应用 二、词表示与语言模型词表示方案一&#xff1a;用一组的相关词来表示当前词方案二&#xff1a;one-hot representation&#xff0c;将每一个词表示成一个独立的符号方案三&#xff1a;上下文表示法&#xff08;contextual rep…

Mamba3D革新3D点云分析:超越Transformer,提升本地特征提取效率与性能!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; Mamba3D革新3D点云分析&#xff1a;超越Transformer&#xff0c;提升本地特征提取效率与性能&#xff01; 引言&#xff1a;3D点云分析的重要性与挑战 3D点云…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题&#xff1a;实现日记本 一、文件的基本概念 1.文件 文件是以计算…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

最新AI创作系统,ChatGPT商业运营系统网站源码,SparkAi-v6.5.0,Ai绘画/GPTs应用,文档对话

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

【C语言的完结】:最后的测试题

看到这句话的时候证明&#xff1a; 此刻你我都在努力~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;语言的起点-----C语言 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹…

Delta lake with Java--数据增删改查

之前写的关于spark sql 操作delta lake表的&#xff0c;总觉得有点混乱&#xff0c;今天用Java以真实的数据来进行一次数据的CRUD操作&#xff0c;所涉及的数据来源于Delta lake up and running配套的 GitGitHub - benniehaelen/delta-lake-up-and-running: Companion reposito…

软件无线电系列——信道编译码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、信道编译码 1、数字…

开源的贴吧数据查询工具

贴吧数据查询工具 这是一个贴吧数据查询工具&#xff0c;目前仍处于开发阶段。 本地运行 要本地部署这个项目&#xff0c;请 克隆这个仓库并前往项目目录 git clone https://github.com/Dilettante258/tieba-tools.git cd tieba-tools安装依赖 pnpm install运行项目 np…