当前课程知识点:C++语言程序设计进阶 > 第十一章 流类库与输入/输出 > 输出流 > 向文本文件输出
标准输出设备显示器被系统看作文本文件,所以我们以向标准设备输出为例,介绍文本文件输出格式控制
插入(<<)运算符
为所有标准C++数据类型预先设计的,用于传送字节到一个输出流对象。
插入运算符与操纵符一起工作
控制输出格式。
很多操纵符都定义在
ios_base类中(如hex())、
控制输出宽度
在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。
setw和width仅影响紧随其后的输出项,但其它流格式操纵符保持有效直到发生改变。
dec、oct和hex操纵符设置输入和输出的默认进制。
#include <iostream> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; for(int i = 0; i < 4; i++) { cout.width(10); cout << values[i] << endl; } return 0; } 输出结果: 1.23 35.36 653.7 4358.24
//11_2.cpp #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; string names[] = { "Zoot", "Jimmy", "Al", "Stan" }; for (int i = 0; i < 4; i++) cout << setw(6) << names[i] << setw(10) << values[i] << endl; return 0; } 输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24
//11_3.cpp #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; string names[] = { "Zoot", "Jimmy", "Al", "Stan" }; for (int i=0;i<4;i++) cout << setiosflags(ios_base::left)//左对齐 << setw(6) << names[i] << resetiosflags(ios_base::left) << setw(10) << values[i] << endl; return 0; } 输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24
这个程序中,通过使用带参数的setiosflags操纵符来设置左对齐,setiosflags定义在头文件iomanip中。
参数iosbase::left是iosbase的静态常量,因此引用时必须包括ios_base::前缀。
这里需要用resetiosflags操纵符关闭左对齐标志。setiosflags不同于width和setw,它的影响是持久的,直到用resetiosflags重新恢复默认值时为止 。
setiosflags的参数是该流的格式标志值,可用按位或(|)运算符进行组合
ios_base::skipws 在输入中跳过空白 。
ios_base::left 左对齐值,用填充字符填充右边。
ios_base::right 右对齐值,用填充字符填充左边(默认对齐方式)。
ios_base::internal 在规定的宽度内,指定前缀符号之后,数值之前,插入指定的填充字符。
ios_base::dec 以十进制形式格式化数值(默认进制)。
ios_base::oct 以八进制形式格式化数值 。
ios_base::hex 以十六进制形式格式化数值。
ios_base::showbase 插入前缀符号以表明整数的数制。
ios_base::showpoint 对浮点数值显示小数点和尾部的0 。
ios_base::uppercase 对于十六进制数值显示大写字母A到F,对于科学格式显示大写字母E 。
ios_base::showpos 对于非负数显示正号(“+”)。
ios_base::scientific 以科学格式显示浮点数值。
ios_base::fixed 以定点格式显示浮点数值(没有指数部分) 。
ios_base::unitbuf 在每次插入之后转储并清除缓冲区内容。
浮点数输出精度的默认值是6,例如:3466.98。
要改变精度:setprecision操纵符(定义在头文件iomanip中)。
如果不指定fixed或scientific,精度值表示有效数字位数。
如果设置了iosbase::fixed或iosbase::scientific精度值表示小数点之后的位数。
//11_4_1.cpp #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; string names[] = { "Zoot", "Jimmy", "Al", "Stan" }; for (int i=0;i<4;i++) cout << setiosflags(ios_base::left) << setw(6) << names[i] << resetiosflags(ios_base::left)//清除左对齐设置 << setw(10) << setprecision(1) << values[i] << endl; return 0; } 输出结果: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003
//11_4_2.cpp #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; string names[] = { "Zoot", "Jimmy", "Al", "Stan" }; cout << setiosflags(ios_base::fixed); for (int i=0;i<4;i++) cout << setiosflags(ios_base::left) << setw(6) << names[i] << resetiosflags(ios_base::left)//清除左对齐设置 << setw(10) << setprecision(1) << values[i] << endl; return 0; } 输出结果: Zoot 1.2 Jimmy 35.4 Al 653.7 Stan 4358.2
//11_4_3.cpp #include <iostream> #include <iomanip> #include <string> using namespace std; int main() { double values[] = { 1.23, 35.36, 653.7, 4358.24 }; string names[] = { "Zoot", "Jimmy", "Al", "Stan" }; cout << setiosflags(ios_base::scientific); for (int i=0;i<4;i++) cout << setiosflags(ios_base::left) << setw(6) << names[i] << resetiosflags(ios_base::left)//清除左对齐设置 << setw(10) << setprecision(1) << values[i] << endl; return 0; } 输出结果: Zoot 1.2e+000 Jimmy 3.5e+001 Al 6.5e+002 Stan 4.4e+003
大家好
欢迎继续学习C++语言程序设计
这一节我们来学习
如何向文本文件中输出信息
其实呢
系统将标准输出设备 显示器
就看作是文本文件
所以呢
我们就以向标准输出设备
向显示器输出为例
来介绍
如何控制
输出文本文件时候的格式
实际上向文件文本中输出呢
最方便的办法
就是使用插入运算符
这个大家在前面的章节学习中
已经非常熟悉了
我们用标准输出流对象cout
使用插入运算符
就可以将文本信息
插入到标准输出流里面去
顺着这个标准输出流呢
就流到标准输出设备了
于是我们就在显示器上
看见我们输出的信息了
如果我们使用插入运算符
将文本信息
输出到标准设备的时候
我们不需要指定特殊的输出格式
那么系统就会根据
输出数据的类型不同
按照默认的格式进行输出
实际上
大多数时候
这个默认格式也还基本上够用
但是
C++还为我们提供了
很方便的格式控制方式
比如说你要控制输出的宽度
精度
按照几进制来输出
这些都可以控制
那么控制输出格式的一个
主要方式
就是使用操纵符
英文叫manipulator
它不是操作符
操作符是operator
那么我们叫它操纵符
也有的资料上呢
叫它操纵算子
英文是manipulator
现在我们来看看
操纵符有哪些
而怎么用
我们将插入运算符
与操纵符一起工作呢
就可以按照我们的需要
来控制输出格式了
所有这些操纵符呢
都定义在ios_base类里面
比如说控制
按十六进制输出的操纵符
还有iomanip这个头文件里面
比如说setprecision
控制精度的操纵符
那么如果我们需要控制输出宽度
我们就在流里面放入setw操纵符
或者我们还可以调用width
这个成员函数
为每个项去指定输出宽度
这里我们要注意呢
setw和width它仅仅影响
跟随其后的输出项
它就影响一项
所以呢
我们如果要控制宽度
要为每一个输出项去设置宽度
而其他的流格式操纵符
它的效果是持久的
它一直会保持这个效果
直到你又给它定义
新的不同的格式为止
那么还有
det oct和hex操作符
可以用来设置
输出和输出的默认的进制
接下来我们就来看一个例子
在这个例子中呢
我们要控制这个输出项的宽度
在这个例子中
我们以输出到
标准输出设备显示器为例
来演示当我们向文本文件
输出数据的时候
怎么样去控制它输出格式中的
这个字符宽度
也就是每个输出项
占多少个字符的空间
看这个例子中呢
我们定义了一个
double类型的数组values
数组的元素初始化为四个元素
然后我们通过这个for循环
依次将这四个元素
向标准输出设备显示器来输出
每输出一个换一下行
然后这个输出的宽度呢
指的是每个项
它所占的字符数
这里我们调用width函数
将宽度设为10
也就是每个输出项
将占10个字符的位置
我们看一下
实际运行时候的输出结果
由于我们没有指定对齐方式
所以就按照默认的方式
采取右对齐
然后输出的内容
不足10个字符的时候
前面要用前导字符去填充
默认情况下
填充的前导字符是空格
所以这里不足10个字符的情况下
我们看到
都是用空格填充的
控制输出宽度呢
还可以用操纵符
这道例题中呢
我们用操纵符setw
来指定输出项的宽度
这里我们定义了两个数组
values和names
分别存放数值和字符串表示姓名
然后在这个for循环中呢
我们在每一行
先输出一个
names数组里面的字符串
然后再对应输出
相应的values数组里面的
一个double数值
我们用setw(6)
来控制这个names
数组里面的字符串
输出宽度为6个字符
用setw(10)去控制values
这个数组里面的double元素
它的输出宽度是10个字符
默认情况下
前导字符都是空格
所以不足的部分
大家看到空格补齐了
然后默认情况下呢
对齐方式都是右对齐的
在这个例题中呢
我们来设置一下对齐方式
跟前面例题中的数据
是一样的
还是一个values数组
和一个names数组
仍然是在for循环中
我们每行首先输出names
数组里面的一个字符串
然后再输出values数组
里面的一个double数据
但是现在我们希望
将字符串的输出设置为左对齐
而这个实数
double类型的数组中的数据呢
设置为右对齐
现在我们来看
用setiosflags这个操纵符
来设置对齐方式
设置的时候
它的参数我们用了ios_base
这个类里面定义的静态常量left
表示左对齐
好 设置完左对齐之后
它后面的所有的输出项
都会按左对齐来输出了
那接下来呢
我们再设置names数组中的元素
字符串
它的输出的宽度是6个字符
setw的参数为6
然后输出names元素
这样输出完了以后
接下来
我们又该输出values数组
里面的double类型元素了
这个时候我们不希望它左对齐了
希望它变成右对齐
但是这个setiosflags这个操纵符
它跟设置宽度的操纵符不一样
它一旦设置了
就会一直起作用
直到你取消这个设置为止
所以我们还要再次调用
这个resetiosflags这个操纵符
将左对齐的设置取消
那这样
它就又回到
默认的右对齐的方式了
接下来呢
设置这个double数据的
输出项的宽度为10
所以我们就看到
在每一行的输出结果里面
左对齐输出string
它占6个字符的宽度
右对齐输出double数据
占10个字符的宽度
那么不足的部分呢
都是用空格来填充的
我们看到在刚才这个程序中呢
通过使用带参数的
setiosflags操纵符
可以来设置左对齐
那么这个setiosflags
它定义在头文件iomanip里面
参数ios_base left
是ios_base的一个静态常量
因此我们引用它的时候
就必须包括ios_base这个前缀
这里我们需要使用
resetiosflags操纵符
来关闭左对齐的标志
setiosflags
它不同于设置宽度的width
和setw
它的影响是持久的
你只要设置了以后
它就一直有效
直到你用resetiosflags
重新恢复以前的默认设置为止
这个setoisflags它的参数呢
是这个流的格式标志
我们可以用按位或运算符
将多种标志进行组合
这里我们列出了iosflags
里面可用的参数
也就是流的格式标识
那大家可以按照
这上面的说明
去自己编写一些小程序
对照使用一下
你可以观察一下效果
是不是达到这样的效果
接下来我们来学习
如何控制输出精度
在默认情况下
浮点数的输出精度是6
也就是6位有效数字
例如3466.98
如果我们想改变输出精度
设置一个不同的输出精度
那就要用setprecision
如果我们在输出的时候
不指定是用定点形式fixed
或者是科学记数法形式
scientific
那么系统就会根据你
要输出的数值本身的大小
和特点
自动选择一种输出模式
那这个时候呢
精度值就表示
有效数字的位数
如果我们特意指定了
是用定点形式
或者科学记数法形式
来输出浮点数
那么这个时候你要再设置精度呢
这个精度值
它就表示小数点之后的位数了
下面呢
我们就通过例题观察一下
如何控制输出的精度
在这个例题中我们来演示一下
当向文本文件输出的时候
怎么样控制double类型数据
它的精度
也就是浮点数的输出精度
控制浮点数的输出精度呢
要用setprecision这个操纵符
这个操纵符
它括号里面有一个参数
这个参数代表什么含义呢
在不同的情况下
代表的含义会不同
首先我们看这个例题
没有指定是以fix方式
或者是scientific方式输出
也就是说
没有指定是以定点小数的方式
还是以科学计数法的方式输出
在这种情况下
setprecision它这个参数就表示
有效数字的位数
现在我们来看
输出names
数组里面字符串的时候
仍然是设置为左对齐方式
宽度6个字符
然后接下来要输出
values数组里面的double数据了
取消左对齐方式的设置
然后设置宽度为10个字符
设置精度为1位有效数字
我们看这个输出结果
到底是取定点的方式
还是scientific
也就是科学计数法的方式来输出
这个我们没有指定
所以系统根据数字的特点
自动选取一种方式
但是我们看
这两种方式输出的内容呢
它的数据的有效位数都是1位
现在我们对这个程序稍作修改
在这儿加了一行
指定以定点方式输出
也就是小数点固定的方式来输出
这种情况下
setprecision它的含义就不一样了
这个参数1
就不代表着说
有效数字是1位有效数字
不是的了
它就代表小数点后有1位小数
含义就变了
程序的其他部分
仍然跟刚才一样 没有修改
现在我们看输出效果的差别
输出的浮点数呢
都是以定点方式输出了
这儿我们用ios_base
里面的静态常量fix指定了
它是用定点方式输出
那不仅如此呢
由于指定了定点方式输出
我们看到这个setprecision1
它的效果就是
小数点后面都有1位小数
好 接下来我们再修改一下
现在我们指定是以
scientific方式输出
还是调用了setiosflags
然后它的参数用ios_base里面的
scientific这个静态常量
表示用科学计数法的方式输出
这个时候sotprecision
后面的参数
也是表示它的小数位数
那我们看现在这个输出的效果
它都是按照scientific方式输出了
而且它的小数的位数都是1位
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义