当前课程知识点:C++语言程序设计进阶 >  第十一章 流类库与输入/输出 >  输出流 >  向文本文件输出

返回《C++语言程序设计进阶》慕课在线视频课程列表

向文本文件输出在线视频

向文本文件输出

向文本文件输出

标准输出设备显示器被系统看作文本文件,所以我们以向标准设备输出为例,介绍文本文件输出格式控制

插入运算符

操纵符(manipulator)

例11-1 使用width控制输出宽度

#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使用setw操纵符指定宽度

//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设置对齐方式

//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的参数(流的格式标识)

精度

例11-4控制输出精度——未指定fixed或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控制输出精度——指定fixed

//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控制输出精度——指定scientific

//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++语言程序设计进阶》慕课在线视频列表

向文本文件输出课程教案、知识点、字幕

大家好

欢迎继续学习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位

C++语言程序设计进阶课程列表:

第七章 继承与派生

-导学

--导学

-继承的基本概念和语法

--继承的基本概念和语法

-第七章 继承与派生--继承的基本概念和语法习题

-继承方式

--继承方式简介及公有继承

--私有继承和保护继承

-第七章 继承与派生--继承方式

-基类与派生类类型转换

--基类与派生类类型转换

-第七章 继承与派生--基类与派生类类型转换

-派生类的构造和析构

--派生类的构造函数

--派生类的构造函数举例

--派生类的复制构造函数

--派生类的析构函数

--第七章 继承与派生--派生类的构造和析构

-派生类成员的标识与访问

--访问从基类继承的成员

--虚基类

-第七章 继承与派生--派生类成员的标识与访问

-小结

--小结

-综合实例

--第七章综合实例

-实验七

--实验七

-第七章讲义

第八章 多态性

-导学

--导学

-第八章 多态性--导学

-运算符重载

--运算符重载的规则

--双目运算符重载为成员函数

--单目运算符重载为成员函数

--运算符重载为非成员函数

-第八章 多态性--运算符重载

-虚函数

--虚函数

--虚析构函数

--虚表与动态绑定

-第八章 多态性--虚函数

-抽象类

--抽象类

--第八章 多态性--抽象类

-override与final

--override与final

-第八章 多态性--override与final

-小结

--第八章小结

-综合实例

--第八章综合实例

-实验八

--实验八

- 第八章讲义

第九章 模板与群体数据

-导学

--导学

-模板

--函数模板

--类模板

-第九章 模板与群体数据--模板

-线性群体

--线性群体的概念

-第九章 模板与群体数据--线性群体

-数组

--数组类模板

--例9-4数组类应用举例

-链表

--链表的概念与结点类模板

--链表类模板

-第九章 模板与群体数据--链表

-栈

--栈类模板

--栈类模板课后习题

--例9-9 栈的应用

--例9-9 栈的应用课后习题

-队列

--队列类模板

-第九章 模板与群体数据--队列

-排序

--排序概述

--插入排序

--选择排序

--交换排序

-第九章 模板与群体数据--排序

-查找

--查找

--查找课后习题

-小结

--小结

-综合实例

--综合实例

-实验九

--实验九

- 第九章讲义

第十章 泛型程序设计与C++标准模板库

-导学

--导学

-泛型程序设计及STL的结构

--泛型程序设计的基本概念

--STL简介

-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构

-迭代器

--迭代器

-第十章 泛型程序设计与C++标准模板库--迭代器

-容器的基本功能与分类

--容器的基本功能与分类

-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类

-顺序容器

--顺序容器的基本功能

--顺序容器的特征

--顺序容器的插入迭代器与适配器

--第十章 泛型程序设计与C++标准模板库--顺序容器

-关联容器

--关联容器分类和基本功能

--集合

--映射

--多重集合和多重映射

-第十章 泛型程序设计与C++标准模板库--关联容器

-函数对象

--函数对象

--函数适配器

-算法

--算法

-小结

--第十章小结

-综合实例

--综合实例

-实验十

--实验十

- 第十章讲义

第十一章 流类库与输入/输出

-导学

--导学

-I/O流的概念及流类库结构

--I/O流的概念及流类库结构

-第十一章 流类库与输入/输出--I/O流的概念及流类库结构

-输出流

--输出流概述

--向文本文件输出

--向二进制文件输出

--向字符串输出

-第十一章 流类库与输入/输出--输出流

-输入流

--输入流概述

--输入流应用举例

--从字符串输入

-第十一章 流类库与输入/输出--输入流

-输入/输出流

--输入/输出流

-第十一章 流类库与输入/输出--输入/输出流

-小结

--小结

-综合实例

--综合实例

-实验十一

--实验十一

- 第十一章讲义

第十二章 异常处理

-导学

--第12章导学

-异常处理的思想与程序实现

--异常处理的思想与程序实现

-第十二章 异常处理--异常处理的思想与程序实现

-异常处理中的构造与析构

--异常处理中的构造与析构

-第十二章 异常处理--异常处理中的构造与析构

-标准程序库异常处理

--标准程序库异常处理

-第十二章 异常处理--标准程序库异常处理

-小结

--第12章小结

-综合实例

--综合实例

-实验十二

--实验十二

- 第十二章讲义

向文本文件输出笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。