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

进度条(小程序)

缓冲区的概念

缓冲区是内存中的一个临时存储区域,用来存放输入或输出数据。在标准 I/O 库中,缓冲区的使用可以提高数据处理的效率。例如,当向终端输出文本时,字符通常存储在缓冲区中,直到缓冲区满或者遇到特定条件时才实际向终端设备输出。

标准 I/O 的缓冲类型

标准 I/O 流(如 stdout,即标准输出)可以有以下几种缓冲模式:

  1. 全缓冲(Fully Buffered):数据会积存在缓冲区中,直到缓冲区满了才进行实际的 I/O 操作。这通常用在对文件的操作中。

  2. 行缓冲(Line Buffered):数据会积存在缓冲区中,直到遇到换行符或缓冲区满了才进行输出。标准输出通常是行缓冲的,当它连接到终端设备时。

  3. 无缓冲(Unbuffered):数据立即从程序传送到输出设备,stderr 通常是无缓冲的。

int main()
{printf("hellow world     ");sleep(3);return 0;
}

示例代码的缓冲行为

在您的示例代码中,printf("you can see me ") 输出一个字符串。由于这个字符串后面没有换行符(\n),并且程序随后执行了 sleep(3),所以这个字符串可能会停留在行缓冲中,直到程序结束或缓冲区满才会被实际输出。如果程序是在一个终端上运行,可能会有短暂的延迟,在 sleep 完成后,这条信息才显示在屏幕上。

强制刷新缓冲区

如果希望即使没有换行符也能立即看到输出,可以使用 fflush(stdout) 来强制刷新标准输出的缓冲区,使得所有缓冲的数据被立即写出: 

printf("you can see me ");
fflush(stdout);  // 强制刷新缓冲区,立即输出上面的文本
sleep(3);

回车+换行

回车(Carriage Return, CR)和换行(Line Feed, LF)是两个历史上用于表示文本行结束的控制字符,它们的使用和含义随操作系统的不同而有所变化。

回车 (CR)

  • 符号\r
  • ASCII 码:13
  • 用途:在打字机和早期的计算机打印设备中,回车指令使打印头回到行首的位置。

换行 (LF)

  • 符号\n
  • ASCII 码:10
  • 用途:在打字机和计算机打印设备中,换行指令使打印头下移一行。

不同操作系统中的使用

  1. Windows

    • 在 Windows 系统中,行结束符是回车加换行的组合(\r\n)。这种组合使得打印头首先回到行首(CR),然后向下移动到下一行(LF),这对应了早期打字机的操作。
  2. Unix/Linux

    • Unix 和 Linux 系统只使用换行(\n)作为行结束符。这简化了处理过程,因为大多数文本编辑和显示操作都默认新行开始于当前位置的下一行。
  3. Mac OS

    • 早期的 Mac 操作系统(如 Mac OS 9 及之前版本)使用单独的回车(\r)作为行结束符。但从 Mac OS X 开始,它转向了 Unix 风格,使用单独的换行(\n)。

编程和网络协议中的影响

在编程和数据交换中,不同的行结束符标准经常导致跨平台的文本处理问题。例如,一个在 Windows 上创建的文本文件可能会在 Unix/Linux 系统中显示为带有额外空白字符的长行,反之亦然。因此,许多现代文本编辑器和开发工具提供了自动检测或转换行结束符的功能。

在网络协议(如 HTTP)中,规定必须使用 \r\n 来结束一行,以确保协议的统一和兼容。

一个小的倒计时代码

int main()
{int cnt = 10;while(cnt){printf("%-2d\r", cnt);fflush(stdout);cnt--;sleep(1);}printf("\n");return 0;
}

这段 C 程序是一个从 10 倒数到 1 的倒计时器。它使用 printf 函数和 \r(回车)来在同一行上更新数字,每次更新前都会将光标移回行首。fflush(stdout) 确保每次打印的数字都能立即显示出来,而 sleep(1) 让程序每打印一个数字后暂停一秒。最后,程序在倒计时结束后输出一个换行符,然后结束。

一个简易的进度条代码

#include <stdio.h>
#include <unistd.h>  
#include <string.h>#define MAX 101
#define LABEL '='  int main()
{char bar[MAX];memset(bar, '\0', sizeof(bar));  // 初始化数组,设置为全部是 null 字符int i = 0;while(i < 100){printf("%s\r", bar);fflush(stdout);  // 刷新输出,确保每次循环的内容都能立即显示bar[i++] = LABEL;  // 将当前位置的字符设置为 LABELusleep(100000);  // usleep 参数单位是微秒,100000 微秒等于 0.1 秒}printf("\n");  // 正确地输出一个换行符,原代码中写的是 %nreturn 0;
}

这段 C 程序创建了一个逐步填充的进度条。它初始化一个字符数组,然后在循环中逐个添加等号 ('=') 到数组中,并实时在终端显示更新的进度条,每次更新间隔0.1秒。循环完成后,程序输出一个换行符,以整洁地结束显示。

http://www.lryc.cn/news/344919.html

相关文章:

  • PyCharm安装教程(超详细图文教程)
  • 金蝶BI应收分析报表:关于应收,这样分析
  • salmon使用体验
  • Ubuntu 20.04 安装 Ansible
  • TypeScript学习笔记:强类型JavaScript的优雅之旅
  • 监控异地组网怎么组网?
  • 将本地托管模型与 Elastic AI Assistant 结合使用的好处
  • Linux的内核态和用户态
  • springboot利用Redis的Geo数据类型,获取附近店铺的坐标位置和距离列表
  • Vitis HLS 学习笔记--理解串流Stream(2)
  • Golang | Leetcode Golang题解之第80题删除有序数组中的重复项II
  • uniapp自定义websocket类实现socket通信、心跳检测、连接检测、重连机制
  • Hive UDTF之explode函数、Lateral View侧视图
  • 智慧公厕打造智慧城市新标杆
  • 字节发布文生图模型PuLID:高效身份ID特征定制,单张图像克隆AI虚拟分身
  • SpringBoot启动流程分析之创建SpringApplication对象(一)
  • SSH简介 特点以及作用
  • MQTT服务搭建及python使用示例
  • Ubuntu如何设置中文输入法
  • PostgreSQL的pg_dump和 pg_dumpall 异同点
  • 【Ping】Windows 网络延迟测试 ping 、telnet、tcping 工具
  • DuDuTalk:4G桌面拾音设备在银行网点服务场景的应用价值
  • QT 设置窗口不透明度
  • 如何在Python中实现文本相似度比较?
  • 韩顺平0基础学Java——第7天
  • 性能远超GPT-4!谷歌发布Med-Gemini医疗模型;李飞飞首次创业瞄准空间智能;疫苗巨头联合OpenAl助力AI医疗...
  • 中国科技大航海时代,“掘金”一带一路
  • ffmpeg7.0 flv支持hdr
  • 【教程】极简Python接入免费语音识别API
  • 详解typora配置亚马逊云科技Amazon S3图床