进度条(小程序)
缓冲区的概念
缓冲区是内存中的一个临时存储区域,用来存放输入或输出数据。在标准 I/O 库中,缓冲区的使用可以提高数据处理的效率。例如,当向终端输出文本时,字符通常存储在缓冲区中,直到缓冲区满或者遇到特定条件时才实际向终端设备输出。
标准 I/O 的缓冲类型
标准 I/O 流(如 stdout
,即标准输出)可以有以下几种缓冲模式:
-
全缓冲(Fully Buffered):数据会积存在缓冲区中,直到缓冲区满了才进行实际的 I/O 操作。这通常用在对文件的操作中。
-
行缓冲(Line Buffered):数据会积存在缓冲区中,直到遇到换行符或缓冲区满了才进行输出。标准输出通常是行缓冲的,当它连接到终端设备时。
-
无缓冲(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
- 用途:在打字机和计算机打印设备中,换行指令使打印头下移一行。
不同操作系统中的使用
-
Windows:
- 在 Windows 系统中,行结束符是回车加换行的组合(
\r\n
)。这种组合使得打印头首先回到行首(CR),然后向下移动到下一行(LF),这对应了早期打字机的操作。
- 在 Windows 系统中,行结束符是回车加换行的组合(
-
Unix/Linux:
- Unix 和 Linux 系统只使用换行(
\n
)作为行结束符。这简化了处理过程,因为大多数文本编辑和显示操作都默认新行开始于当前位置的下一行。
- Unix 和 Linux 系统只使用换行(
-
Mac OS:
- 早期的 Mac 操作系统(如 Mac OS 9 及之前版本)使用单独的回车(
\r
)作为行结束符。但从 Mac OS X 开始,它转向了 Unix 风格,使用单独的换行(\n
)。
- 早期的 Mac 操作系统(如 Mac OS 9 及之前版本)使用单独的回车(
编程和网络协议中的影响
在编程和数据交换中,不同的行结束符标准经常导致跨平台的文本处理问题。例如,一个在 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秒。循环完成后,程序输出一个换行符,以整洁地结束显示。
相关文章:
进度条(小程序)
缓冲区的概念 缓冲区是内存中的一个临时存储区域,用来存放输入或输出数据。在标准 I/O 库中,缓冲区的使用可以提高数据处理的效率。例如,当向终端输出文本时,字符通常存储在缓冲区中,直到缓冲区满或者遇到特定条件时才…...

PyCharm安装教程(超详细图文教程)
一、下载和安装 1.进入PyCharm官方下载,官网下载地址: https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了,网盘下载即可:itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包,然后双击双击.ex…...

金蝶BI应收分析报表:关于应收,这样分析
这是一张出自奥威-金蝶BI方案的BI应收分析报表,是一张综合运用了筛选、内存计算等智能分析功能以及数据可视化图表打造而成的BI数据可视化分析报表,可以让企业运用决策层快速知道应收账款有多少?账龄如何?周转情况如何?…...

salmon使用体验
文章目录 salmon转录本定量brief模式一:fastq作为输入文件需要特别注意得地方 模式二: bam文件作为输入 salmon转录本定量 brief 第一点是,通常说的转录组分析其中有一项是转录本定量,这是一个很trick的说话,说成定量…...
Ubuntu 20.04 安装 Ansible
使用官方的 Ubuntu PPA 更新包列表: apt update安装软件属性常用命令 apt install software-properties-common添加 Ansible PPA 到系统: add-apt-repository --yes --update ppa:ansible/ansible再次更新包列表以包括新添加的 PPA: apt …...
TypeScript学习笔记:强类型JavaScript的优雅之旅
在前端开发领域,JavaScript以其灵活性和广泛的支持度成为无可争议的王者。然而,随着项目规模的增长,JavaScript的动态类型特性开始暴露出一些问题,比如代码的可维护性、类型错误难以提前发现等。为了解决这些问题,Micr…...

监控异地组网怎么组网?
监控异地组网是指在不同地域的网络环境下,实现对监控设备的远程访问和管理。在传统的网络环境下,由于网络限制和设备配置等问题,监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题,引入了天联组网技术,实…...

将本地托管模型与 Elastic AI Assistant 结合使用的好处
作者:来自 Elastic James Spiteri, Dhrumil Patel 当今公共部门组织利用生成式人工智能解决安全挑战的一种方式。 凭借其筛选大量数据以发现异常模式的能力,生成式人工智能现在在帮助团队保护其组织免受网络威胁方面发挥着关键作用。 它还可以帮助安全专…...
Linux的内核态和用户态
一、Linux操作系统运行在两种不同的运行模式下:内核态(Kernel Mode)和用户态(User Mode) 内核态(Kernel Mode): 内核态也称为特权模式或系统模式,是操作系统内核执行代码…...
springboot利用Redis的Geo数据类型,获取附近店铺的坐标位置和距离列表
文章目录 GEO介绍GEO命令行应用添加地理坐标位置获取指定单位半径的全部地理位置列表springboot 的实际应用 GEO介绍 在Redis 3.2版本中,新增了一种数据类型:GEO,它主要用于存储地理位置信息,并对存储的信息进行操作。 GEO实际上…...

Vitis HLS 学习笔记--理解串流Stream(2)
目录 1. 简介 2. 极简的对比 3. 硬件模块的多次触发 4. 进一步探讨 do-while 5. 总结 1. 简介 在这篇博文中《Vitis HLS 学习笔记--AXI_STREAM_TO_MASTER-CSDN博客》,我分享了关于 AXI Stream 接口的实际应用案例。然而,尽管文章中提供了代码示例&…...

Golang | Leetcode Golang题解之第80题删除有序数组中的重复项II
题目: 题解: func removeDuplicates(nums []int) int {n : len(nums)if n < 2 {return n}slow, fast : 2, 2for fast < n {if nums[slow-2] ! nums[fast] {nums[slow] nums[fast]slow}fast}return slow }...
uniapp自定义websocket类实现socket通信、心跳检测、连接检测、重连机制
uniapp自定义websocket类实现socket通信、心跳检测、检测连接、重连机制,仿vue-socket插件功能实现发送序列号进行连接检测,发送消息时42【key,value】格式,根据后端返回数据和需要接收到的数据做nsend与onSocketMessage的修改 //使用socket…...

Hive UDTF之explode函数、Lateral View侧视图
Hive UDTF之explode函数 Hive 中的 explode() 函数是一种用于处理数组类型数据的 User-Defined Table-Generating Function (UDTF)。它将数组拆分成多行,每个数组元素对应生成的一行数据。这在处理嵌套数据结构时非常有用,例如处理 JSON 格式的数据。 …...

智慧公厕打造智慧城市新标杆
公共厕所作为城市基础设施的重要组成部分,直接关系到市民的生活品质和城市形象。传统的公厕管理方式存在着许多问题,如环境脏乱、清洁不及时等,给市民带来了诸多不便和不满。而智慧公厕作为一种全新的管理模式,通过物联网、大数据…...

字节发布文生图模型PuLID:高效身份ID特征定制,单张图像克隆AI虚拟分身
前言 字节研究团队近日提出了一种新型的文生图身份ID定制方法PuLID(Pure and Lightning ID Customization)。相较于传统的微调方法,PuLID无需复杂的参数优化就可以实现高效的身份ID定制,且能最大程度减少对原始模型行为的干扰。 PuLID是通过将轻量级的…...

SpringBoot启动流程分析之创建SpringApplication对象(一)
SpringBoot启动流程分析之创建SpringApplication对象(一) 目录: 文章目录 SpringBoot启动流程分析之创建SpringApplication对象(一)1、SpringApplication的构造方法1.1、推断应用程序类型1.2、设置Initializers1.3、设置Listener1.4、推断main方法所在类 流程分析…...
SSH简介 特点以及作用
引言 SSH(Secure Shell)是一种用于安全远程访问和数据传输的网络协议。它提供了一种安全的机制,使得用户可以在不安全的网络中安全地进行远程登录、命令执行和文件传输。SSH通过加密技术和认证机制来保护数据的安全性,防止数据在…...

MQTT服务搭建及python使用示例
1、MQTT协议 1.1、MQTT介绍 MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,通常用于物联网设备之间的通讯。它具有低带宽、低功耗和开放性等特点,适合在网络带宽有限或者网络连接不稳定…...
Ubuntu如何设置中文输入法
概述 Ubuntu 是一个基于 Debian 构建的开源操作系统,拥有广泛的用户群体和强大的社区支持。是免费、开源的操作系统。被设计为一个适用于个人电脑、服务器和云平台的通用操作系统。Ubuntu的目标是提供一个稳定、易于使用和免费的操作系统,以促进人们在计…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
第14节 Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局…...

SpringSecurity+vue通用权限系统
SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决
20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起: 1、根据RK809的DATASHEET,短按开机【100ms/500ms】/长按关机,长按关机。6s/8s/10s 我在网上找到的DATASHE…...