41、C++ Primer 4th笔记,IO库,格式化IO操作

简介: 1、除了条件状态之外,每个iostream对象还维持一个控制IO格式化细节的状态。如整形值的基数,浮点值的精度,输出元素的宽度等。标准库还定义了一组操纵符来修改对象的格式状态。操纵符(manipulator)是可用作输入或输出运算符的操作数,它是一个函数或对象(a manipulator is a function or object that can be used as an operand([计]操作数;运算对象) to an input or output operator(运算符).)。

1、除了条件状态之外,每个iostream对象还维持一个控制IO格式化细节的状态。如整形值的基数,浮点值的精度,输出元素的宽度等。标准库还定义了一组操纵符来修改对象的格式状态。操纵符(manipulator)是可用作输入或输出运算符的操作数,它是一个函数或对象(a manipulator is a function or object that can be used as an operand([]操作数;运算对象) to an input or output operator(运算符).)。操纵符返回其应用于的流对象,所以可以在一个语句中输出多个操纵符和数据。

2、操纵符罗列

1 iostream 中定义的操纵符

boolalpha

将真和假显示为字符串

x

noboolalpha

将真和假显示为1,0

showbase

产生指出数的基数的前缀

x

noshowbase

不产生记数基数前缀

showpoint

总是显示小数点

x

noshowpoint

有小数部分才显示小数点

showpos

显示非负数中的+

x

noshowpos

不显示非负数中的+

uppercase

在十六进制中打印0X,科学记数法中打印E

x

nouppercase

在十六进制中打印0x,科学记数法中打印e

x

dec

用十进制显示(整形值,符点数不受影响)

hex

用十六进制显示(整形值,符点数不受影响)

oct

用八进制显示(同上)

left

在值的右边增加填充字符

right

在值的左边增加填充字符

internal

在符号和值之间增加填充字符

fixed

用小数形式显示浮点数

scientific

用科学记数法显示浮点数

boolalpha

将真和假显示为字符串

flush

刷新ostream缓冲区

ends

插入空字符,然后刷新ostream缓冲区

endl

插入换行符,然后刷新ostream缓冲区

unitbuf

在每个输出操作之后刷新缓冲区

x

nounitbuf

恢复常规缓冲区刷新

x

skipws

为输入操作符跳过空白

noskipws

不为输入操作符跳过空白

ws

吃掉空白

注:带 x 的是默认流状态。

2 iomanip 中定义的操纵符

setfill(ch)

ch 填充空白

setprecision(n)

将浮点精度置为 n

setw(w)

读写 w 个字符的值

setbase(b)

按基数 b 输出整数

3、读写操纵符的时候,不读写数据,相反,会采取某种行动。改变流格式状态的操纵符通常为后续IO保留改变后的格式状态。取消操纵符的任何状态改变通常是最好的。一般而言,流应该在每个IO操作之后处于通常的默认状态。大多数改变格式状态的操纵符提供设置/复原对,一个操纵符将格式状态置为新值而另一个进行复原,恢复常规默认格式。

4、用flags操作恢复格式状态

    flags 操作类似于管理流的条件状态的rdstatesetstate操作。这种情况下,标准库定义了一对flags函数:

• 不带实参的 flags() 返回流的当前格式状态。返回值是名为 fmtflags的标准库定义类型。

flags(arg) 接受一个实参并将流格式置为实参所指定的格式。

示例代码

void display(ostream& os)
{
	//remember the current format state
	ostream::fmtflags curr_fmt = os.flags();
	//do output that uses manipulators that change the format state of os
	os.flags(curr_fmt); //restore the original format state of os
}

5、控制输出格式

    有两大类的输出控制:控制数值的表示,以及控制填充符的数据和布局。

示例代码

int main()
{	
	bool bool_val;
	cout << boolalpha
		 << bool_val
		 << noboolalpha;
	return 1;
}

6、控制浮点值的格式

1)对于浮点值的格式化,可以控制下面三个方面:

• 精度:显示多少位数字(总位数)。

• 记数法:用小数还是科学记法法显示。

• 对是整数的浮点值的小数点的处理。

示例代码

int main()
{	
	cout << "Precision: " << cout.precision()
		 << ", value: " << sqrt(2.0) << endl;
	int prev_precision = cout.precision(12);
	cout << ", value: " << sqrt(2.0) << endl;
	cout << setprecision(prev_precision);
	cout << ", value: " << sqrt(2.0) << endl;
	return 1;
}

2)恢复浮点值的默认记数法

    与其他操纵符不同,我们必须调用unsetf成员来取消scientificfixed所做的改变。

示例代码

#include <iostream>
#include "string"
#include "cmath"
using namespace std;

int main()
{	
	cout << sqrt(2.0) << '\n' << endl;
	cout << scientific << sqrt(2.0) << endl;
	cout << fixed << sqrt(2.0) << endl;
	//reset to default handling for notation
	cout.unsetf(ostream::floatfield);
	cout << sqrt(2.0) << endl;
	return 1;
}

7、填充输出

setw,指定下一个数值或字符串的最小间隔。

left,左对齐输出。

right,右对齐输出。输出默认为右对齐。

internal,控制负值的符号位置。internal 左对齐符号且右对齐值,用空格填充介于其间的空间。

setfill,使我们能够指定填充输出时使用的另一个字符。默认情况下,值是空格。

    像 endl 一样,setw 不改变输出流的内部状态,它只决定下一个输出的长度。

示例代码

#include <iostream>
#include "string"
#include "cmath"
#include "iomanip"
using namespace std;

int main()
{	
	int i = -16;
	double d = 3.14159;
	cout << setfill('#')
		 << "i: " << setw(12) << i << endl
		 << "d: " << setw(12) << d << endl
		 << setfill(' '); //restore normal pad character
	return 1;
}

8、默认情况下,输入操作符忽略空白(空格,制表符,换行符,进纸和回车)。noskipws则强制要求不跳过空白。

目录
相关文章
|
2月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
638 2
|
2月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
152 11
|
2月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
2月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
364 2
|
3月前
|
并行计算 C++ Windows
|
10月前
|
网络协议 Linux Go
用 Go 基于 epoll 实现一个最小化的IO库
Go 语言社区中存在多个异步网络框架,如 evio、nbio、gnet 和 netpoll 等。这些框架旨在解决标准库 netpoll 的低效问题,如一个连接占用一个 goroutine 导致的资源浪费。easyio 是一个最小化的 IO 框架,核心代码不超过 500 行,仅实现 Linux 下的 epoll 和 TCP 协议。它通过 Worker Pool、Buffer 等优化提高了性能,并提供了简单的事件处理机制。
155 0
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
188 0
|
6月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
281 0