[Linux]手把手教你制作进度条小程序

这篇具有很好参考价值的文章主要介绍了[Linux]手把手教你制作进度条小程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[Linux]制作进度条小程序

C语言中的\n和\r字符

C语言中字符分为两种:

  • 可显字符
  • 控制字符

其中可显字符就是字符a这类的字符,控制字符就是\n这种控制字符。

对于我们制作进度条,我们只需要关注两个控制字符:

  • \r – 进行回车操作
  • \n – 进行换行加回车操作

说明: \n本身是换行字符,但是C语言本身将其解析成了换行加回车。

为了更好地体会字符\r和\n的作用,我们需要做一些测试,为了方便进行编译,创建makefile文件,文件内容如下:

mytest:test.c
	gcc -o mytest test.c
.PHONY:clean
clean:
	rm -f mytest

首先执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("hello world");
    sleep(3);
    fflush(stdout);
	return 0;
}

说明:

  • fflush(stdout)是将标准输出缓冲区刷新,便于观察现象。
  • sleep为Linux系统的休眠函数。

执行结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

在打印完hello world后,程序休眠,"光标"在同一行的下一个位置

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

休眠结束后,将会接着从光标位置开始打印,因此打印的[qxm@aliyun-centos review]$命令行提示符,紧跟在hello world其后。

再执行如下代码:

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

执行结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

由于\n被C语言解析成换行加回车,在打印完hello world后程序休眠,"光标"会到下一行的开始的位置。

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

休眠结束后,将会接着从光标位置开始打印,因此[qxm@aliyun-centos review]$命令行提示符是在下一行的行首打印。

最后执行如下代码:

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

说明:

  • fflush(stdout)是将标准输出缓冲区刷新,便于观察现象。
  • sleep为Linux系统的休眠函数。

执行结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

由于\r为回车,在打印完hello world后程序休眠,"光标"会回到行首。

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

休眠结束后,将会接着从光标位置开始打印,因此[qxm@aliyun-centos review]$命令行提示符将原有的hello world覆盖了。

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

缓冲区的刷新策略

Linux系统下,C语言会将要打印的字符先存放在缓冲区中,只有将缓冲区内的字符刷新到屏幕上,才能在屏幕上看到,缓冲区刷新的情况如下:

  • 遇到\n会将\n前的所有字符刷新到屏幕上。
  • 程序结束时自动刷新缓冲区。

对于缓冲区测试,我们执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("hello world\r");
  	sleep(3);
	return 0;
}

执行结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

因为缓冲区没有刷新,因此程序休眠时,没有任何打印。

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

程序执行结束后,缓冲区被自动刷新,hello world被打印出来,但是由于\r回车将"光标"退回到行首,因此命令提示符的打印将前面的打印覆盖了。

再执行如下代码:

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

执行结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

由于遇到了\n缓冲区内的数据在休眠前刷新了。

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

程序休眠结束后,命令行提示符从光标所在位置开始打印。

进行进度条代码编写

创建以下文件构成代码结构:

  • myproc.h – 保存进度条代码的声明
  • myproc.c – 保存进度条代码的实现
  • main.c – 调用进度条代码

myproc.h文件中的核心结构如下:

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

myproc.c文件中的核心结构如下:

#include "myproc.h"
void process()
{
  //...
}

main.c文件中的核心结构如下:

#include "myproc.h" 
int main()
{
  process();
  return 0;
}

同时创建makefile文件,makefile文件内部写入如下内容:

myproc:myproc.c main.c
	gcc -o myproc myproc.c main.c
.PHONY:clean
clean:
	rm -f myproc

建立好代码结构后,编写如下代码充当图形化进度条:

#include "myproc.h"
#include <string.h>
#include <unistd.h>

#define STYLE '='
#define ARROW '>'
#define SIZE 101

void process()
{
  char buf[SIZE];
  memset(buf, 0 , SIZE);
  int i = 0;
  while(i <= 100)
  {
    printf("[%-100s]\r", buf);
    fflush(stdout);
    buf[i++] = STYLE;
    if(i != 100 )buf[i] = ARROW;
    usleep(100000);
  }
  printf("\n");
}

首先创建一个字符串用于保存要打印的图形化进度条buf,对其进行初始化,然后在打印时进行左对齐打印buf并且按100个字符长度打印,

每次打印完回车覆盖上一次从打印,并且刷新缓冲区使得打印显示到屏幕上,使用休眠函数来充当进度的加载。

打印的效果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

除了图形化进度条还要设置数字化进度显示,因此需要对打印进行修改,如下:

printf("[%-100s][%d%%]\r", buf, i);

增加打印进度百分比作为数据化进度显示,%%将会转义成一个%打印在屏幕上。

打印的效果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言

最后增添一个旋转光标表示进度条正在不断执行,因此需要对打印再进行修改,得到最终的代码如下:

#include "myproc.h"
#include <string.h>
#include <unistd.h>

#define STYLE '='
#define ARROW '>'
#define SIZE 101

void process()
{
  const char* cursor = "|/-\\";
  char buf[SIZE];
  memset(buf, 0 , SIZE);
  int i = 0;
  while(i <= 100)
  {
    printf("[%-100s][%d%%][%c]\r", buf, i, cursor[i%4]);
    fflush(stdout);
    buf[i++] = STYLE;
    if(i != 100 )buf[i] = ARROW;
    usleep(100000);
  }
  printf("\n");
}

添加了cursor字符串保存旋转光标的样式,其中\\会转义成一个\,因为旋转光标中是将4个字符循环打印因此将样式字符串模4输出。

最终进度条的演示结果如下:

[Linux]手把手教你制作进度条小程序,Linux,linux,小程序,apache,服务器,c语言文章来源地址https://www.toymoban.com/news/detail-631370.html

到了这里,关于[Linux]手把手教你制作进度条小程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【pgzero】手把手教你制作游戏——Pong

    今天要做的游戏叫Pong,它是世界上第一款街机游戏。 (关键它好做) 制作游戏的引擎有很多,比如 Unity 、 Construct . . . . . . ...... ...... 而今天我们用的既不是Unity,也不是Construct,而是 Python 。 制作游戏的模块是 pgzero ,它是在 Python 比较有名的库 Pygame 上又加了一层封装,对

    2024年03月24日
    浏览(45)
  • 【手把手教你制作一个简易版的shell】

    为了简便,命令行中的提示符我们可以直接用printf打印,而具体执行命令可以交给子进程去做,现在的关键是如何将获得的命令行中的命令切割。我们在学习C语言时提到了strtok函数,正好这个函数可以用来作为切割。 基本框架: 不知道大家注意到了没有,我们从键盘中读取

    2023年04月16日
    浏览(46)
  • 若依ruoyi——手把手教你制作自己的管理系统【二、修改样式】

    阿里图标一( ̄︶ ̄*)) 图片白嫖一((* ̄3 ̄)╭ ********* 专栏略长 ==== 爆肝万字 ==== 细节狂魔 ==== 请准备好一键三连 ********* 运行成功后: idea后台正常先挂着 我习惯用VScode操作 当然如果有两台机子 一个挂后台一个改前端就更好了 只需修改 vue.config.js 配置文件即可 eg:按 Win+R 打

    2024年02月03日
    浏览(45)
  • 若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

    增删改查导一( ̄︶ ̄*)) 按钮换个色一((* ̄3 ̄)╭ ********* 专栏略长 ==== 爆肝万字 ==== 细节狂魔 ==== 请准备好一键三连 ********* 修改后的页面: 干干净净贼舒服一Ψ( ̄∀ ̄)Ψ——Ψ( ̄∀ ̄)Ψ一 接下来我们要达到的效果如下(自定义菜单 里面有列表数据回显+增删改查) 一、修改

    2023年04月25日
    浏览(41)
  • 手把手教你Linux的网络配置

    目录 网络连接测试 测试Linux虚拟机是否与主机连接 测试主机是否与虚拟机连接 网络连接模式 桥接模式 NAT模式 仅主机模式 修改静态IP 修改 IP 地址后可能会遇到的问题 配置主机名 测试Linux虚拟机是否与主机连接 首先可以在windows界面,windows + R键输出cmd打开命令行,输入  

    2024年02月03日
    浏览(48)
  • 用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页

    明天就是女朋友的生日了, 是时候展现专属于程序员的浪漫了!你打算怎么给心爱的人表达爱意?鲜花礼物?代码表白?还是创意DIY?或者…无论那种形式,快来秀我们一脸吧! HTML生日祝福网页制作(粉色主题)程序员专属生日表白网站 💬 注:以下代码为部分演示,如需完整

    2024年02月16日
    浏览(50)
  • 手把手教你小程序反编译

    1.反编译工具unveilr :百度网盘链接:https://pan.baidu.com/s/10Wle8CwvBq54GPWcbEnxLQ 提取码:bivh   解压即可用。 2.微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 1.获取小程序存储文件夹 (1)打开PC端微信设置,在文件管理中找到存储路径,选择打开文件夹。

    2024年04月12日
    浏览(39)
  • 手把手教你绘制小程序海报

    海报分享功能在许多应用中应该是很常见的,因为它作为一种常用的应用推广和拉新的方式。 接下来看个实际的案例,如下: 把任务拆解下: 如何绘制海报 如何把绘制后的海报保存到相册 用 canvas 来绘制海报。 这里需要了解基本的 canvas api ,不熟悉可以先去了解下相关

    2024年02月04日
    浏览(48)
  • 手把手教你反编译小程序

    操作系统: win10 10.0.19042 node: v14.17.0 微信开发者工具: Stable 1.05.2110290 在电脑端安装模拟器工具,这里以夜神模拟器为例, 在模拟器中安装微信:用于微信打开小程序时加载小程序包。 在模拟器中文件管理器:用于查看小程序包,这里使用模拟器自带的Amaze。 文件共享路径:可

    2024年02月08日
    浏览(36)
  • 手把手教你制作登录、注册界面 SpringBoot+Vue.js(cookie的灵活运用,验证码功能)

    实现思路:用户在界面输入用户名和密码传入变量。用post方法传输到后端,后端接收整个实体对象。将用户名提取出。在dao层方法中通过select注解查询,返回数据库对应的数据对象。如果返回为空则return false。不为空则通过比对数据库返回的密码和用户输入的密码,如果二者

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包