【C++】格式化输出详解:掌握 cout 的进阶用法

文章目录
- 💯前言
- 💯格式化输出的理论概述
- 💯控制输出宽度和填充字符
- `setw` 操作符
- `setfill` 操作符
- 💯控制浮点数的显示格式
- `fixed` 与 `scientific`
- `setprecision`
- 💯整数的进制表示控制
- `dec`、`hex`、`oct`
- 💯控制对齐方式
- `left` 与 `right`
- 💯结合操纵符的应用场景
- 表格化输出
- 💯小结

💯前言
- 在编写 C++ 程序时,
cout是我们用来输出信息的基础工具。然而,仅仅使用cout进行简单的输出往往难以满足复杂应用场景的需求。我们需要深入掌握各种格式化输出的技巧,以便更精确地控制输出,适应各类场合的需求。在本文中,我们将系统性地探讨如何使用 C++ 提供的<iomanip>头文件及相关操纵符来灵活控制输出格式,包括对齐方式、数值表示方式、宽度管理等方面,帮助你更好地呈现数据,使代码输出更加规范和具有可读性。
C++ 参考手册

💯格式化输出的理论概述
在 C++ 中,cout 是最常用的输出流,我们通常用它来输出变量和字符串。然而,当涉及复杂的格式化需求,如对齐表格、控制浮点精度或设置字段宽度时,简单的 cout 就显得力不从心。在这些情况下,C++ 提供了 <iomanip> 头文件,该头文件包含了一组称为操纵符(I/O manipulators)的工具,可以帮助我们更精细地控制输出格式。通过这些操纵符,我们可以以简洁的方式实现数据的对齐、精度控制和特殊的数值表示方式。
格式化输出的目的不仅在于使数据更加美观,还在于提高数据的可读性和条理性。例如,在生成报表、科学计算或数据对比等场景中,保持对齐、统一数值格式,或对某些值进行标识是至关重要的。这些技巧能够有效提升程序的可读性与专业性,进而使代码的使用和维护更加便利。
![]()
💯控制输出宽度和填充字符
在许多应用中,我们需要指定输出内容的宽度,以确保数据对齐、整齐。在这种情况下,操纵符 setw 和 setfill 就非常有用。
![]()
setw 操作符
setw 操作符用于设置输出内容的最小宽度。它只对紧跟其后的输出项生效。例如:
#include <iostream>
#include <iomanip>
using namespace std;int main() {int a = 123;cout << "默认宽度: " << a << endl;cout << "宽度设置为5: " << setw(5) << a << endl;cout << "宽度设置为10: " << setw(10) << a << endl;return 0;
}

在上述代码中,setw(10) 将输出的宽度设置为 10。如果实际输出内容的长度小于 10,那么 cout 将用空格填充不足的部分。输出结果如下:
默认宽度: 123
宽度设置为5: 123
宽度设置为10: 123
可以看到,数字 123 被右对齐,并且前面填充了空格,使得输出的总宽度为 10 个字符。这种方法在输出多行数据时尤其有用,可以让不同数据列之间保持对齐,从而增强视觉上的条理性。
setfill 操作符
setfill 操作符用于设置宽度填充的字符。例如:
cout << "宽度为10, 不够时填充*: " << setw(10) << setfill('*') << a << endl;

输出结果为:
宽度为10, 不够时填充*: *******123
在此例中,setw(10) 将宽度设置为 10,setfill('*') 将填充字符设为 *,因此空余部分被 * 填充而非默认的空格。setfill 在需要突出某些输出时特别有用,比如在生成报表时用特定符号区分表格边界或某些特殊字段。
setw 和 setfill 的结合使用,可以实现对输出格式的灵活控制,使输出不仅对齐,还具有特定的视觉风格。这在生成具有高可读性和专业感的数据报表时尤为重要。
💯控制浮点数的显示格式
浮点数的输出常常需要特定的格式,例如控制小数位数或者以科学计数法显示。在 C++ 中,这些需求可以通过操纵符 fixed、scientific 和 setprecision 实现。
![]()
fixed 与 scientific
fixed:将浮点数以固定小数点的形式显示,即使数值较大,也不会使用科学计数法。它在财务计算等场景中非常实用,因为金额通常以固定的小数位数表示,以确保输出的一致性。scientific:以科学计数法形式输出浮点数,通常用于非常大或非常小的数值。例如在科学研究或工程计算中,科学计数法可以使结果更加简洁和易读。
以下是示例代码:
#include <iostream>
#include <iomanip>
using namespace std;int main() {double pi = 3.141592653589793;cout << "默认: " << pi << endl;cout << "固定小数点方式: " << fixed << pi << endl;cout << "科学计数法方式: " << scientific << pi << endl;return 0;
}

输出结果:
默认: 3.14159
固定小数点方式: 3.141593
科学计数法方式: 3.141593e+00
可以看到,默认情况下输出保留 6 位有效数字,而 fixed 会使输出以固定小数点形式显示,scientific 则将其以科学计数法形式输出。对于大多数日常应用场景,fixed 常用于财务报表、精密计算结果等需要固定格式的场合,以确保输出的统一性。
setprecision
setprecision 操作符用于设置浮点数的小数点后的精度。例如:
cout << "固定小数点, 小数点后2位: " << fixed << setprecision(2) << pi << endl;

输出结果为:
固定小数点, 小数点后2位: 3.14
结合使用 fixed 和 setprecision(2),可以将小数点后的位数限制为 2 位。这种精度控制对于财务报表或科学计算结果的显示非常有用,因为它可以减少精度引起的数值差异,从而保证数据的一致性和可读性。
💯整数的进制表示控制
在某些应用场景中,我们需要以不同的进制表示整数,例如十进制、十六进制或八进制。在 C++ 中,可以使用 dec、hex 和 oct 操纵符来控制整数的进制输出方式。
![]()
dec、hex、oct
dec:以十进制形式输出(这是默认方式)。hex:以十六进制形式输出,这在处理内存地址或位运算时非常常见。oct:以八进制形式输出,虽然现代应用中较少使用八进制,但在某些领域它依然有其独特的应用价值。
示例代码如下:
#include <iostream>
#include <iomanip>
using namespace std;int main() {int n = 255;cout << "+十进制: " << dec << n << endl;cout << "+十六进制: " << hex << n << endl;cout << "+八进制: " << oct << n << endl;return 0;
}

输出结果:
+十进制: 255
+十六进制: ff
+八进制: 377
可以看到,使用不同的操纵符可以将同一个整数 255 分别表示为十进制、十六进制和八进制。这种多样化的表示方法使得数据在不同应用场景下更加灵活,尤其是在底层编程和调试过程中,十六进制的表示方式尤为重要,因为它与计算机内部的二进制表示更为接近。
💯控制对齐方式
在输出复杂数据时,我们常常需要指定对齐方式,以确保数据的整齐性和可读性。在 C++ 中,默认的对齐方式是右对齐,但我们可以使用 left 操纵符来实现左对齐。
![]()
left 与 right
right:这是默认的对齐方式,通常适用于数值数据,使得同一列的数据看起来更加整齐。left:将输出内容左对齐,适用于字符串数据,使得文本输出更加自然,尤其是在表格化输出时有助于增强可读性。
示例代码如下:
#include <iostream>
#include <iomanip>
using namespace std;int main() {int n = 123;cout << "右对齐: " << setw(10) << right << n << endl;cout << "左对齐: " << setw(10) << left << n << endl;return 0;
}

输出结果:
右对齐: 123
左对齐: 123
通过使用 setw(10) 设置宽度为 10,并结合 left 和 right 操纵符,可以实现数据的左右对齐。这种对齐控制在格式化表格数据时非常有用,可以确保每一列的数据在视觉上保持对齐,从而使输出更加整齐有序,便于阅读。
💯结合操纵符的应用场景
![]()
表格化输出
如果你想在控制台中输出对齐的表格,可以结合 setw、setfill、left 和 right 操作符来实现。例如:
#include <iostream>
#include <iomanip>
using namespace std;int main() {cout << left << setw(15) << "Name" << setw(10) << "Age" << setw(15) << "City" << endl;cout << setfill('-') << setw(40) << "" << setfill(' ') << endl;cout << left << setw(15) << "Alice" << setw(10) << 30 << setw(15) << "New York" << endl;cout << left << setw(15) << "Bob" << setw(10) << 25 << setw(15) << "Los Angeles" << endl;return 0;
}

输出结果:
Name Age City
----------------------------------------
Alice 30 New York
Bob 25 Los Angeles
通过合理利用操纵符,输出内容整齐对齐,显得更加美观和专业。这样的输出方式在生成控制台报表时尤为重要,可以使得数据之间的关系更加清晰,并显著提高可读性。
在更加复杂的应用场景中,例如多列数据的复杂报表或者需要精细对齐的输出内容,我们可以灵活地使用这些操纵符,结合逻辑控制来实现动态输出。这些格式化输出技巧对于数据展示、对比分析以及终端用户交流等方面都至关重要。
💯小结

通过本文的学习,我们深入探讨了如何在 C++ 中利用<iomanip>提供的多种操纵符实现格式化输出。我们讨论了如何控制输出宽度、填充字符、浮点数精度、整数进制表示方式以及对齐方式等操作。这些技巧对于编写更为复杂和专业的 C++ 程序,提升代码输出的规范性和可读性具有重要意义。
掌握这些技巧后,你可以灵活应用于各种项目中,例如生成数据报表、对齐数据输出,或者进行格式化的控制台展示,从而使代码更加具有专业水准。这些技巧在自动化报告生成、科学计算结果展示以及数据库记录打印等实际项目中具有广泛应用。
希望这篇文章能对你在 C++ 学习中的进阶之路有所帮助。通过深入掌握这些细节,你将不仅能显著提高代码的输出效果,还能够更有效地与他人分享和交流数据和信息。如果你有任何关于 C++ 输出格式化的问题,欢迎随时进行讨论和交流。

相关文章:
【C++】格式化输出详解:掌握 cout 的进阶用法
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯格式化输出的理论概述💯控制输出宽度和填充字符setw 操作符setfill 操作符 💯控制浮点数的显示格式fixed 与 scientificsetprecision 💯…...
设计模式学习思路二
设计模式的学习思路_设计模式必须按顺序进行吗-CSDN博客 以下是一些方法和思路可以帮助你更清晰地识别使用了哪种设计模式。 1. 确定模式时的思考步骤 以下是分析代码时,你可以遵循的一些思路和步骤,帮助你识别可能使用的设计模式: a. 识别…...
什么是等级保护
1.为什么要实施等级保护: •国家信息安全形势严峻(敌对势力),针对基础信息系统的违法犯罪持续上升(网上诈骗、入侵、网上盗窃) •维护国家安全的需求(基础信息网络【互联网、电信网、广电网】及重要信息系统【银行、铁路、电力、海关】已经成为国家的关键基础设施) •信息安全是…...
k8s api对象,CRD
在Kubernetes项目中,一个API对象在Etcd里的完整资源路径,是由:Group(API组)、Version(API版本)和Resource(API资源类型)三个部分组成 apiVersion: batch/v2alpha1 kind:…...
【C++指南】C++内存管理 深度解析
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 🍃1.自动内存管理…...
C++小碗菜之二:软件单元测试
“没有测试的代码重构不能称之为重构,它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试? 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…...
PyCharm+Selenium+Pytest配置小记
1、下载ChromeDriver: Chrome130以后的Driver下载: Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ (1)查看自己Crome浏览器的版本:设置-->关于 Chrome; &…...
摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04
Learning Roadmap: Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem(摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客)UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Remote Communication Kit
1.问题描述: DynamicDnsRule有没有示例?这个地址是怎么解析出来 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/remote-communication-rcp-0000001770911890#section8160554134811 解决方案: ‘DynamicDnsRule’&a…...
【日常记录-Mybatis】PageHelper导致语句截断
1. 简介 PageHelper是Mybatis-Plus中的一个插件,主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象,并保存到本地线程ThreadLocal中,接下来,PageHelper会进入Mybatis的拦截器环节,…...
随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
JVM 类加载器有哪些?双亲委派机制的作用是什么?如何自定义类加载器?
类加载器分类 大家好,我是码哥,可以叫我靓仔,《Redis 高手心法》畅销书作者。 先回顾下,在 Java 中,类的初始化分为几个阶段: 加载、链接(包括验证、准备和解析)和 初始化。 而 类加载器&#x…...
从基态到激发态再到里德伯态的双光子激发过程
铯原子(Cs)从基态6S1/2到激发态6P3/2再到里德伯态44D5/2的双光子激发过程, 并通过数值计算和图形化展示来研究不同失谐条件下的拉比频率、AC Stark位移差以及散射概率的变化 结果显示,在给定的实验参数下,拉比频率较低…...
Clickhouse 外部存储引擎
文章目录 外部存储引擎分类MySQL引擎PostgreSQL引擎MongoDB引擎JDBC引擎ODBC引擎Kafka引擎RabbitMQ引擎File引擎URL引擎HDFS引擎 外部存储引擎分类 引擎类型描述特点MySQL从 MySQL 数据库中读取数据用于与 MySQL 数据库共享数据,支持读取 MySQL 表中的数据 支持 SQ…...
eclipse怎么配置jdk路径?
在Eclipse中配置JDK路径是一个简单的步骤,以下是配置JDK路径的步骤: 打开Eclipse:启动Eclipse IDE。 访问首选项: 在Eclipse的菜单栏中,选择 Window > Preferences(对于Mac OS X用户,选择 E…...
【前端】JavaScript 中的创建对象模式要点
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯对象属性值中的引号规则💯对象属性换行与尾随逗号的使用💯工厂模式:灵活高效的对象创建💯自定义构造函数:通过…...
GWAS分析先做后学
大家好,我是邓飞。 GWAS分析是生物信息和统计学的交叉学科,上可以学习编程,下可以学习统计。对于Linux系统,R语言,作图,统计学,机器学习等方向,都是一个极好的入门项目。生物信息如…...
【系统设计】高可用之缓存基础
缓存的缘起 使用缓存的主要原因包括提高系统性能、降低数据库负载、提升用户体验和保证系统可用性。 在计算机体系结构中,由于处理器和存储器的处理时间不匹配,在处理器和一个较大较慢的设备之间插入一个更小更快的存储设备(如高速缓存&a…...
《Java核心技术I》volatile字段
volatile字段 有多处理器的计算机能够暂时在寄存器或本地内存缓存中保存内存值,其结果是,运行在不同处理器上的线程可能看到同一个内存位置上有不同的值。编译器可以改变指令执行的顺序以使吞吐量更大化,编译器不会选择可能改变代码语义的顺…...
2024运维故障记 | 12/2 网易云音乐崩了
#运维故障记# 前两天看到网易云音乐崩了的新闻,回想了一下,今年从网易云音乐到支付宝、还有微软,近期就发生了好几起运维届的故障。 今年来不及计数了,先做个记录。 明年看看运维届的大故障会发生多少,什么原因&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
