C++ 学习(2) ---- std::cout 格式化输出

devtools/2024/10/24 4:33:07/

目录

        • std::cout 格式化输出简介
        • 使用成员函数
        • 使用流操作算子

std::cout 格式化输出简介

C++ 通常使用cout输出数据,和printf()函数相比,cout实现格式化输出数据的方式更加多样化;
一方面,cout 作为 ostream 类的对象,该类中提供有一些成员方法,可实现对输出数据的格式化;另一方面,为了方面用户格式化输出数据,C++ 标准库专门提供了一个 <iomanip> 头文件,该头文件中包含有大量的格式控制符,也就是流操作算子,使用上更加方便;
cout 格式化输出有两种方法,一种是直接使用成员函数,另一种是使用流操作算子,下面分别进行介绍:

使用成员函数

cout 的基类是 ostream 类,ostream 类 中还包含一些可实现格式化输出的成员方法,这些成员方法都是从 ios 基类(以及 ios_base类)中继承来的,cout(以及 cerrclog)也能调用:

成员函数说明
flags(fmtfl)当前的格式全部替换为fmtfl,fmtfl 可以是一种格式,也可以是多种格式
precision(n)设置输出浮点数的精度为 n
width(w)指定输出宽度为 w 个字符
fill(c)在指定输出宽度的情况下,输出宽度不足用 c 填充
setf(fmtfl, mask)在当前格式的基础上,追加 fmtfl 格式,并且删除 mask 格式,其中mask参数可以省略
unsetf(mask)在当前格式的基础上,删除 mask 格式

对于上面函数中的 flags 函数的fmtfl参数,setf() 函数中的 fmtfl 参数以及 unsetf() 函数可以选择下面的值:

标志作用
ios::boolapha把 true 和 false 输出为字符串
ios::left输出数据在本域宽范围内向左对齐
ios::right输出数据在本域宽范围内向右对齐
ios::internal数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充
ios::dec设置整数的基数为 10
ios::oct设置整数的基数为 8
ios::hex设置整数的基数为 16
ios::showbase强制输出整数的基数(八进制数以 0 开头,十六进制数以 0x 打头)
ios::showpoint强制输出浮点数的小点和尾数 0
ios::uppercase在以科学记数法格式 E 和以十六进制输出字母时以大写表示
ios::showpos对正数显示“+”号
ios::scientific浮点数以科学记数法格式输出
ios::fixed浮点数以定点格式(小数形式)输出
ios::unitbuf每次输出之后刷新所有的流

setf(fmtfl, mask)unsetf(fmtfl, mask) 中的mask 参数,可以传递为下面的几个:

标志作用
ios::adjustfieldios::left , ios::right , ios::internal
ios::basefieldios::dec ,ios::oct ,ios::hex
ios::floatfieldios::scientific , ios::fixed

使用 cout 成员函数的示例程序如下:

bool testCoutUsingflags() {{// setf(fmt,mask) 在当前格式的基础上追加 fmt flag, 并且删除 mask 格式std::cout.setf(std::ios::boolalpha);bool a = true;std::cout << "bool a:" << a << std::endl;int m = 100;std::cout.setf(std::ios::hex, std::ios::basefield);std::cout << "int m:" << m << " bool a " << a << std::endl;// 去除相应的标志std::cout.unsetf(std::ios::boolalpha);std::cout << "hex print int m:" << m << " bool a " << a << std::endl;std::cout.setf(std::ios::dec, std::ios::basefield);int n = 0x110;std::cout << "dec print int n:" << n << std::endl;std::cout.setf(std::ios::oct, std::ios::basefield);std::cout.setf(std::ios::showbase);std::cout << "oct print int n:" << n << std::endl;}{std::cout.setf(std::ios::fixed, std::ios::floatfield);float f = 1 / 3.0f;std::cout << "float f in fixed is:" << f << std::endl;std::cout.precision(10);std::cout << "float f precision 10 in fixed is:" << f << std::endl;std::cout.setf(std::ios::scientific, std::ios::floatfield);std::cout.precision(3);std::cout << "float f in scientific is:" << f << std::endl;std::cout.setf(std::ios::uppercase);std::cout << "float f in scientific uppercase is:" << f << std::endl;}{std::cout.width(50);std::cout.fill('_');std::cout.setf(std::ios::left, std::ios::adjustfield);std::cout << "this is my demo" << std::endl;std::cout.unsetf(std::ios::adjustfield);std::cout.width(50);std::cout.fill('_');std::cout.setf(std::ios::right, std::ios::adjustfield);std::cout << "this is my demo" << std::endl;}return true;
}

输出结果如下:

bool a:true
int m:64 bool a true
hex print int m:64 bool a 1
dec print int n:272
oct print int n:0420
float f in fixed is:0.333333
float f precision 10 in fixed is:0.3333333433
float f in scientific is:3.333e-01
float f in scientific uppercase is:3.333E-01
this is my demo___________________________________
this is my demo
this is my demo
使用流操作算子

流操作算子实在iomanip中定义的,要使用这些流操作算子,必须包含此头文件:

注意下面的 *号,表示默认使用的算子,比如: 在默认情况下,整数使用十进制形式输出

流操作算子作用
*dec以十进制形式输出整数
hex以十六进制形式输出整数
oct以八进制形式输出整数
fixed以小数形式输出浮点数
scientific以科学计数法计数形式输出浮点数
left左对齐,宽度不足的时候填充字符到右边
*right右对齐,宽度不足的时候填充字符到左边
setbase(b)设置输出整数的进制,b=8、10或者16
setw(w)指定输出宽度为w个字符,或者输入字符串读取w个字符
setfill(c)指定输出宽度的情况下,输出宽度不足用字符c填充(默认是使用空格填充)
setprecision(n)输出浮点数的精度为 n, 就是小数点后应该暴露的位数
boolaplha把 true 和 false 输出为字符串
noboolalpha把true 和 false 输出为0,1
showbase输出数值进制的前缀
noshowbase不输出数值进制的前缀
showpoint总是输出小数点
*noshowpoint只有当小数部分存在时才显示小数点
showpos在非负数中显示+
*noshowpos在非负数中不显示+
uppercase十六进制使用 A~E,设置显示前缀,那么前缀输出为0X
*nouppercase十六进制使用 a~e,设置显示前缀,那么前缀输出为0x

使用流操作算子控制输出的综合程序如下:

bool testCoutUsingStreamflags() {// stream operation flag will take effect all time util you set another flagbool a = false;std::cout << "bool a:" << std::boolalpha << a << std::endl;std::cout << "bool a:" << std::noboolalpha << a << std::endl;// showbase and dec oct & hexint m = 80;std::cout <<"dec int m:" << std::dec << std::showbase << m << std::endl;std::cout << "hex int m:" << std::hex << std::showbase << m << std::endl;std::cout << "oct int m:" << std::oct << std::showbase << m << std::endl;// std::showpos 显示 + -std::cout << "dec int m:" << std::dec << std::showbase << std::showpos << m << std::endl;// setw and setfillstd::cout << std::left << std::setw(50) << std::setfill('_') << "hello world" << std::endl;std::cout << std::right << std::setw(50) << std::setfill('_') << "hello world" << std::endl;std::cout << std::internal << std::setw(50) << std::setfill('_') << "hello world m:" << m << std::endl;std::cout << std::noshowpos << std::endl;int n = 100;std::cout << std::setbase(16) << std::showbase << "int n:" << n << std::endl;float f = 1 / 3.0f;// 0.333333std::cout << std::fixed << "f = " << f << std::endl;// 0.33333std::cout << std::fixed << std::setprecision(5) << "f = " << f << std::endl;// 3.33333e-1std::cout << std::scientific << std::setprecision(5) << "f = " << f << std::endl;// 3.33333E-1std::cout << std::scientific << std::uppercase << std::setprecision(5) << "f = " << f << std::endl;// std::showpoint 强制输出浮点数的小点和尾数0 std::cout << std::fixed << std::showpoint << std::setprecision(5) << "f = " << f << std::endl;{// print pointer 指针有做特殊的处理int* ptr = new int(10);std::cout << std::showbase << std::hex << ptr << std::endl;std::cout << std::showbase << std::hex << reinterpret_cast<intptr_t*>(ptr) << std::endl;delete ptr;}return true;
}

输出结果如下:

basic test main enter
basicCplusplusCout::testbasicCplusplusCoutImpl enter
bool a:false
bool a:0
dec int m:80
hex int m:0x50
oct int m:0120
dec int m:+80
hello world_______________________________________
_______________________________________hello world
____________________________________hello world m:+80int n:0x64
f = 0.333333
f = 0.33333
f = 3.33333e-01
f = 3.33333E-01
f = 0.33333
000001E419046150
000001E419046150

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

相关文章

目标检测——YOLOv10: Real-Time End-to-End Object Detection

YOLOv10是在YOLOv8的基础上&#xff0c;借鉴了RT-DETR的一些创新点改进出来的 标题&#xff1a;YOLOv10: Real-Time End-to-End Object Detection论文&#xff1a;https://arxiv.org/pdf/2405.14458源码&#xff1a;https://github.com/THU-MIG/yolov10 1. 论文介绍 在过去的几…

介绍 Apache Spark 的基本概念和在大数据分析中的应用

Apache Spark是一种快速、可扩展、通用的大数据处理引擎。它提供了一种高效的方式来处理和分析大规模数据集&#xff0c;具有优秀的性能和易用性。 Spark的基本概念包括&#xff1a; 弹性分布式数据集&#xff08;Resilient Distributed Dataset&#xff0c;简称RDD&#xff0…

全国青少年软件编程Scratch(图形化)考级真题下载-202309

全国青少年软件编程&#xff08;图形化&#xff09;等级考试202012真题 全国青少年软件编程(图形化)等级考试202103真题 全国青少年软件编程&#xff08;图形化&#xff09;等级考试试202212真题 全国青少年软件编程&#xff08;图形化、C语言、Python&#xff09;等级考试2…

Git使用教程

Git使用教程 安装Git git下载地址 访问上述链接安装完成后进行相关配置 Git使用前配置 查看配置 可以通过下述命令查看所有的配置以及它们所在的文件 $ git config --list --show-origin# 以下为运行命令后的结果 file:C:/software/Git/Git/etc/gitconfig diff.astextpla…

世媒讯带您了解什么是媒体邀约

什么是媒体邀约&#xff1f;其实媒体邀约是一种公关策略&#xff0c;旨在通过邀请媒体记者和编辑参加特定的活动、发布会或其他重要事件&#xff0c;以确保这些活动能够得到广泛的报道和关注。通过这种方式&#xff0c;企业和组织希望能够传达重要信息&#xff0c;提高品牌知名…

【Qt】如何搭建Qt开发环境

Qt的开发工具 需要搭建Qt开发环境&#xff0c;需要安装3个部分&#xff1a; C编译器&#xff08;gcc、cl.exe...&#xff09;注意&#xff0c;这里的C编译器不是指visual studio这种集成开发环境&#xff0c;编译器不等于IDE&#xff0c;编译器只是IDE调用的一个程序。Qt SDK…

英特尔裁员、暂停分红和市场挑战

英特尔&#xff08;INTC&#xff09;近日宣布了一系列战略调整&#xff0c;以应对其面临的严峻挑战。这家总部位于加利福尼亚州圣克拉拉的芯片制造商计划裁员超过15%&#xff0c;并从第四季度起暂停派息&#xff0c;以重振其盈利能力。 股价暴跌与市值蒸发 英特尔的这一决定导…

软件登录常见测试用例

以下是一些软件登录的测试用例示例&#xff1a; 正确的用户名和密码&#xff1a; 输入正确的用户名和密码。预期结果&#xff1a;登录成功&#xff0c;跳转到软件的主界面。 错误的用户名&#xff1a; 输入错误的用户名和正确的密码。预期结果&#xff1a;显示错误提示信息&am…