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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

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


在这里插入图片描述


💯前言

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

💯格式化输出的理论概述

在 C++ 中,cout 是最常用的输出流,我们通常用它来输出变量和字符串。然而,当涉及复杂的格式化需求,如对齐表格控制浮点精度设置字段宽度时,简单的 cout 就显得力不从心。在这些情况下,C++ 提供了 <iomanip> 头文件,该头文件包含了一组称为操纵符(I/O manipulators)的工具,可以帮助我们更精细地控制输出格式。通过这些操纵符,我们可以以简洁的方式实现数据的对齐、精度控制和特殊的数值表示方式。

格式化输出的目的不仅在于使数据更加美观,还在于提高数据的可读性和条理性。例如,在生成报表科学计算数据对比等场景中,保持对齐、统一数值格式,或对某些值进行标识是至关重要的。这些技巧能够有效提升程序的可读性与专业性,进而使代码的使用和维护更加便利。
在这里插入图片描述


💯控制输出宽度和填充字符

在许多应用中,我们需要指定输出内容的宽度,以确保数据对齐、整齐。在这种情况下,操纵符 setwsetfill 就非常有用。
在这里插入图片描述


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 在需要突出某些输出时特别有用,比如在生成报表时用特定符号区分表格边界或某些特殊字段。

setwsetfill 的结合使用,可以实现对输出格式的灵活控制,使输出不仅对齐,还具有特定的视觉风格。这在生成具有高可读性和专业感的数据报表时尤为重要。


💯控制浮点数的显示格式

浮点数的输出常常需要特定的格式,例如控制小数位数或者以科学计数法显示。在 C++ 中,这些需求可以通过操纵符 fixedscientificsetprecision 实现。
在这里插入图片描述


fixedscientific

  • 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

结合使用 fixedsetprecision(2),可以将小数点后的位数限制为 2 位。这种精度控制对于财务报表或科学计算结果的显示非常有用,因为它可以减少精度引起的数值差异,从而保证数据的一致性和可读性。


💯整数的进制表示控制

在某些应用场景中,我们需要以不同的进制表示整数,例如十进制、十六进制或八进制。在 C++ 中,可以使用 dechexoct 操纵符来控制整数的进制输出方式。
在这里插入图片描述


dechexoct

  • 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 操纵符来实现左对齐。
在这里插入图片描述


leftright

  • 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,并结合 leftright 操纵符,可以实现数据的左右对齐。这种对齐控制在格式化表格数据时非常有用,可以确保每一列的数据在视觉上保持对齐,从而使输出更加整齐有序,便于阅读。


💯结合操纵符的应用场景

在这里插入图片描述


表格化输出

如果你想在控制台中输出对齐的表格,可以结合 setwsetfillleftright 操作符来实现。例如:

#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++ 输出格式化的问题,欢迎随时进行讨论和交流。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/484760.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++指南】C++内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 &#x1f343;1.自动内存管理…

MacOS安装软件后无法启动报错:“已损坏,无法打开,你应该将它移到废纸篓“

目录 报错截图 解决方法 知识科普 报错截图 解决方法 1. 打开系统设置->安全性与隐私->选择任何来源 2. 如果打开没有看到"任何来源"&#xff0c;如果不开启“任何来源”的选项&#xff0c;会直接影响到无法运行的第三方应用。开启“任何来源”的方法如下&a…

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…

入门网络安全工程师要学习哪些内容(详细教程)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…

JAVA |日常开发中JSTL标签库详解

JAVA &#xff5c;日常开发中JSTL标签库详解 前言一、JSTL 概述1.1 定义1.2 优势 二、JSTL 核心标签库2.1 导入 JSTL 库2.2 <c:out>标签 - 输出数据2.3 <c:if>标签 - 条件判断2.4 <c:choose>、<c:when>和<c:otherwise>标签 - 多条件选择 结束语优…

【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

Java版-速通数据结构-树基础知识

现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而&#xff0c;我们如果直接去看红黑树&#xff0c;可能会一下子蒙了。在看红黑树之前&#xff0c;需要先了解下树的基础知识&#xff0c;从简单到复杂&#xff0c;看看红黑树是在什么…

C++《set与map》

在之前我们已经学习了解了CSTL当中的string和vector等容器&#xff0c;现在我们已经懂得了这些容器提供的接口该如何使用&#xff0c;并且了解了这些容器的底层结构。接下来我们在本篇当中将继续学习STL内的容器set与map&#xff0c;在此这两个容器与我们之前学习的容器提供的成…

Scala—Slice(提取子序列)方法详解

Scala—Slice&#xff08;提取子序列&#xff09;方法详解 在 Scala 中&#xff0c;slice 方法用于从集合中提取一个连续的子序列&#xff08;切片&#xff09;。可以应用于多种集合类型&#xff0c;如 List、Array、Seq 等。 一、slice 方法的定义 slice 根据提供的起始索引…

Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件)

一、前言&#xff1a; 上一篇文章我们使用了Shader绘制了一个基本的三角形&#xff0c;但是&#xff0c;发现那样写Shader程序特别麻烦&#xff0c;各种加双引号&#xff0c;还没有语法高亮提示。因为glsl也和java、c一样是一门语言&#xff0c;实际工程项目都是单独的glsl文件…

挑战用React封装100个组件【009】

Hello&#xff0c;大家好&#xff0c;今天我挑战的组件是这样的&#xff01; 欢迎大家把项目拉下来使用哦&#xff01; 项目地址&#xff1a; https://github.com/hismeyy/react-component-100 今天还是用到了react-icons。这里就不过多介绍啦&#xff0c;大家可以在前面的挑战…

电子病历静态数据脱敏路径探索

一、引言 数据脱敏&#xff08;Data Masking&#xff09;&#xff0c;屏蔽敏感数据&#xff0c;对某些敏感信息&#xff08;比如patient_name、ip_no、ad、no、icd11、drug等等 &#xff09;通过脱敏规则进行数据的变形&#xff0c;实现隐私数据的可靠保护。电子病历作为医疗领…

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入&#xff0c;后端访问也正常&#xff0c;可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息&#xff1a;Error: Cannot find module ‘/v…

高端空气净化器airgle—甲醛克星 | 双十二选购指南

随着双十二购物节的临近&#xff0c;许多消费者开始关注高端空气净化器的选购。甲醛作为室内空气污染的主要元凶之一&#xff0c;选择一款高效的空气净化器显得尤为重要。本文将详细介绍Airgle高端空气净化器的技术优势及其在除甲醛方面的卓越表现。 甲醛对健康的影响 甲醛超标…

LCR 023. 相交链表

一.题目&#xff1a; LCR 023. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 二.我的原始解法-无&#xff1a; 三.其他人的正确及好的解法&#xff0c;力扣解法参考&#xff1a; 哈希表法及双指针法&#xff1a;LCR 023. 相交链表 - 力扣&#xff08;LeetCode&#xff0…

RocketMq详解:六、RocketMq的负载均衡机制

上一章&#xff1a;《SpringBootAop实现RocketMq的幂等》 文章目录 1.背景1.1 什么是负载均衡1.2 负载均衡的意义 2.RocketMQ消息消费2.1 消息的流转过程2.2 Consumer消费消息的流程 3.RocketMq的负载均衡策略3.1 Broker负载均衡3.2 Producer发送消息负载均衡3.3 消费端的负载均…

02-开发环境搭建

02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节&#xff1a; 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上&#xff0c;注册成为开发者&#xff0c;并完成实名认证。 打开华为开发者联盟官网&#xff0c;点击“注册”进入…

使用SQLark分析达梦慢SQL执行计划的一次实践

最近刚参加完达梦的 DCP 培训与考试&#xff0c;正好业务系统有个 sql 查询较慢&#xff0c;就想着练练手。 在深入了解达梦的过程中&#xff0c;发现达梦新出了一款叫 SQLark 百灵连接的工具。 我首先去官网大致浏览了下。虽然 SQLark 在功能深度上不如 DM Manager 和 PL/SQ…

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…