Rust语言进阶之标准输出:stdout用法实例(一百零六)

devtools/2025/2/11 11:52:37/

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者

新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2. Rust之stdout介绍
    • 🌻3. 代码实例
      • 🐓3.1 输出简单的文本
      • 🐓3.2 使用 print! 和 println! 输出带格式的文本
      • 🐓3.3 使用 stdout 刷新输出缓冲区
      • 🐓3.4 用法总结

🌻1.前言

本篇目的:Rust语言进阶之标准输出:stdout用法实例

🌻2. Rust之stdout介绍

stdout是Rust标准库中std::io模块的一部分,代表标准输出流,用于将程序的输出写入控制台或终端。

  1. 写入标准输出
    stdout的核心功能是将数据写入标准输出流,通常是终端或控制台。这使得Rust程序能够向用户展示结果或信息,是交互式应用和命令行工具中不可或缺的部分。通过stdout,程序能够输出文本、数字和其他类型的数据,方便开发者与用户进行信息交换。

  2. 结合缓冲区提高性能
    默认情况下,stdout是缓冲的,这意味着数据会先被写入内存中的缓冲区,然后才会实际写入终端。这种缓冲机制能够显著提高输出性能,尤其是在频繁输出数据的情况下。通过缓冲,stdout避免了频繁的I/O操作,从而减少了资源消耗并提升了程序执行效率。

  3. 支持格式化输出
    Rust的stdout支持格式化输出,这使得开发者能够以特定格式展示数据。例如,开发者可以通过write!writeln!宏来格式化字符串,将变量值插入到输出中。格式化输出提供了灵活性,能够满足不同场景下的输出需求,如显示数值、日期或复杂的数据结构。

  4. 可与stderr区分使用
    除了stdout,Rust还提供了标准错误流stderr,它通常用于输出错误信息。在某些应用中,开发者可能希望将标准输出和错误输出分开,以便更清晰地显示错误信息。stdout主要用于正常的程序输出,而stderr用于报告错误或警告。Rust通过这种区分提供了更好的日志管理和错误处理机制。

  5. 支持错误处理
    像其他I/O操作一样,stdout的写入操作也可能发生错误,例如,终端关闭、权限问题等。Rust通过Result类型来处理这些错误,确保程序能够安全地处理可能发生的异常。在使用stdout时,开发者通常需要检查写入操作的返回值,以确保程序的稳定性和可靠性。

🌻3. 代码实例

🐓3.1 输出简单的文本

  • 1.应用场景:stdout 的最基本用途是将文本输出到控制台。这在所有命令行程序中都很常见,用于显示提示信息、结果或日志。
  • 2.通用语法:
use std::io::{self, Write};io::stdout().write_all(b"Hello, Rust!\n")?;
  • 3.用法实例
use std::io::{self, Write};fn main() -> io::Result<()> {io::stdout().write_all(b"Hello, world!\n")?; // 输出简单的字符串Ok(())
}

write_all(b"Hello, world!\n") 用于将字节串直接写入标准输出。
b"Hello, world!\n" 表示字节串(&[u8]),这是标准输出需要的格式。

🐓3.2 使用 print! 和 println! 输出带格式的文本

  • 1.应用场景:Rust 提供了 print! 和 println! 宏来输出格式化的文本。println! 会自动在输出的末尾添加换行符,而 print! 不会。它们常用于格式化输出和调试信息。
  • 2.通用语法:
print!("Hello, {}!", name);
println!("Hello, {}!", name);
  • 3.用法实例
fn main() {let name = "Rust";print!("Hello, {}!", name); // 不换行println!("Hello, {}!", name); // 自动换行
}

print! 和 println! 用于格式化输出,println! 在输出后自动添加换行符。
它们支持占位符 {},可以插入变量值或表达式的结果。

🐓3.3 使用 stdout 刷新输出缓冲区

  • 1.应用场景:stdout 是带有缓冲区的,因此输出可能不会立刻显示。通过 flush 方法,可以手动刷新缓冲区,确保输出立即显示
  • 2.通用语法:
use std::io::{self, Write};io::stdout().flush()?;
  • 3.用法实例
use std::io::{self, Write};fn main() -> io::Result<()> {print!("请输入你的名字: ");io::stdout().flush()?; // 确保输出立刻显示let mut name = String::new();io::stdin().read_line(&mut name)?;println!("你好, {}!", name.trim());Ok(())
}

flush() 方法会刷新标准输出缓冲区,确保输出内容立刻显示。这对于命令行交互非常有用,例如提示用户输入时。

🐓3.4 用法总结

在这里插入图片描述


http://www.ppmy.cn/devtools/157915.html

相关文章

STM32调试工具OLED

OLED调试工具 OLED简介&#xff1a;有机发光二极管 OLED显示屏&#xff1a;性能优异的新型显示屏&#xff0c;具有功耗低&#xff0c;响应速度快&#xff0c;宽视角…… 供电&#xff1a;3-3.5V&#xff0c;通信协议&#xff1a;12C/SPI&#xff0c;分辨率&#xff1a;12864 …

【高级架构师】多线程和高并发编程(三):锁(中)深入ReentrantLock

文章目录 3、深入ReentrantLock3.1 ReentrantLock和synchronized的区别3.2 AQS概述3.3 加锁流程源码剖析3.3.1 加锁流程概述3.3.2 三种加锁源码分析3.3.2.1 lock方法3.3.2.2 tryLock方法3.3.2.3 lockInterruptibly方法 3.4 释放锁流程源码剖析3.4.1 释放锁流程概述3.4.2 释放锁…

CNN-day7-经典神经网络VGG

day8-经典神经网络VGG VGG的亮点在于它通过堆叠多个卷积层&#xff0c;以小的卷积核和池化层的方式来增加网络深度&#xff0c;从而实现高精度的图像识别。这种方法可以有效地捕获图像中的高级特征&#xff0c;并通过不断拟合训练数据来提高识别准确率。 1 小卷积作用 某层f…

基于架构的软件设计(Architecture-Based Software Design, ABSD)

1. 引言 在现代软件开发中&#xff0c;软件架构不仅决定了系统的可扩展性、可维护性和性能&#xff0c;还直接影响开发效率和成本。基于架构的软件设计&#xff08;ABSD&#xff09; 采用系统化的方法&#xff0c;通过架构驱动整个软件开发生命周期&#xff0c;以确保系统的稳…

气体控制器联动风机,检测到环境出现异常时自动打开风机进行排风;

一、功能&#xff1a;检测到环境出现异常时自动打开风机进行排风&#xff1b; 二、设备&#xff1a; 1.气体控制器主机&#xff1a;温湿度&#xff0c;TVOC等探头的主机&#xff0c;可上报数据&#xff0c;探头监测到异常时&#xff0c;主机会监测到异常可联动风机或声光报警…

Lua限流器的3种写法

学而不思则罔&#xff0c;思而不学则殆 引言 上篇文章讲解了Lua脚本&#xff0c;事务和Pipline之间的使用方式和性能差距&#xff0c;本篇文章将聚焦Lua脚本&#xff0c;我将用三种写法来展现如何实现一个Redis限流器 固定窗口限流 固定窗口限流也是最简单的限流算法&#x…

JavaScript:||=的写法作用

||的写法作用 介绍解释总结 介绍 || 是一种逻辑赋值操作符&#xff08;logical assignment operator&#xff09;&#xff0c;它是 JavaScript 中的一种简写方式&#xff0c;结合了逻辑运算符 ||&#xff08;逻辑或&#xff09;和赋值操作符 。它的作用是&#xff1a; • 如果…

【Uniapp-Vue3】UniCloud云数据库获取指定字段的数据

使用where方法可以获取指定的字段&#xff1a; let db uniCloud.database(); db.collection("数据表").where({字段名1:数据, 字段名2:数据}).get({getOne:true}) 如果我们不在get中添加{getOne:true}&#xff0c;在只获取到一个数据res.result.data将会是一个数组&…