当前课程知识点:C++语言程序设计进阶 > 第十一章 流类库与输入/输出 > 输出流 > 输出流概述
ostream
ofstream
ostringstream
cout 标准输出
cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。
clog 类似于cerr,但是有缓冲,缓冲区满时被输出。
ofstream fout("b.out"); streambuf* pOld =cout.rdbuf(fout.rdbuf()); //… cout.rdbuf(pOld);
ofstream类支持磁盘文件输出
如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的
ofstream myFile("filename");
可以在调用默认构造函数之后使用open成员函数打开文件
ofstream myFile; //声明一个静态文件输出流对象 myFile.open("filename"); //打开文件,使流对象与文件建立联系
在构造对象或用open打开文件时可以指定模式
ofstream myFile("filename", ios_base::out | ios_base::binary);
与操纵符等价的成员函数。
执行非格式化写操作的成员函数。
其它修改流状态且不同于操纵符或插入运算符的成员函数。
open函数
把流与一个特定的磁盘文件关联起来。
需要指定打开模式。
put函数
把一个字符写到输出流中。
write函数
把内存中的一块内容写到一个文件输出流中
seekp和tellp函数
操作文件流的内部指针
close函数
关闭与一个文件输出流关联的磁盘文件
错误处理函数
在写到一个流时进行错误处理
大家好
欢迎继续学习C++语言程序设计
在这一节
我首先将输出流
给大家作一个简要地介绍
在C++中
有三种最重要的输出流
ostream ofstream
和ostringstream
而且还有三个预定义好的
输出流对象
我们知道
大家已经习惯用这个cout
就是一个预定义好的输出流对象
另外呢
还有cerr和clog
cout叫做标准输出流对象
通常我们用它来输出
程序的正常运行结果
正常需要显示给用户看的东西
那么cerr呢
叫做标准错误输出
它是没有缓冲的
发送给它的内容呢
就立即被输出
通常我们用它来输出
一些紧急的错误信息
还有clog
它类似于ceer
但是它有缓冲
只有当缓冲区满的时候
才被输出
比如说一些不是说
在第一时间紧急马上
需要用户看到的东西
但是又是我们运行过程中
需要被记录下来的一些运行状态
或者一些不那么急的错误信息
都可以用clog来输出
那么大家可能会有疑问了
都是向标准设备输出
干吗要分成三个输出对象呢
这三个输出流对象
在某些时候可以根据需要
各自被定向到不同的地方去
默认情况下
它们都是指向标准输出设备的
但是有的时候
我们可能希望
正常的运行输出结果
不要放在显示器上了
因为结果太多
忽忽忽跑
一大屏一大屏地跑
看不太清
这个时候我们可以把cout
定向到某个磁盘文件去
不要让它显示在显示器上了
但是呢
紧急的错误信息
可能我们希望用户第一时间看见
你要是把它
定向到某个文件里面去了
那用户根本就不知道出错了
也不知道程序为什么停下来
到底现在发生了什么
所以这样的信息呢
往往我们用cerr
我们可以让它保留
显示在显示器上
还有一些错误信息呢
可能我们希望把它存到
日志文件中去
我们可以用另外一个clog
把它存到
与正常输出结果不同的
另外一个文件中去
总而言之
在你写程序的时候
你可以根据需要
将这三个标准输出流对象
重新定向到不同的地方去
它们不是必须
总指向标准输出设备的
那么大家可能有些好奇了
到底我用什么办法
可以将这些标准输出流
定向到不同的地方去呢
不管你在任何操作系统底下
一般来说呢
操作系统都会有相应的命令
可以重新指定标准输出设备
如果你不想在操作系统
这一级别将
标准输出设备指定到一个
不同的设备去
去影响所有的程序
那么你可以在你的程序内部
通过C++程序
暂时地重新定向某个标准输出流
我们来看一下程序代码怎么写
那么在这儿呢
我们可以首先构造一个
文件输出流对象
一个ofstream对象
稍后我会仔细介绍文件输出流的
现在大家先大概知道
这个是怎么做的就可以了
构造这样一个文件输出流对象
让这个fout这个对象
绑定到某一个磁盘文件上面去
比如说b.out
然后呢
再调用cout
它的rdbuf这个函数
将当前的这个输出流的指向
暂存起来
然后把它定向到fout
所向的b.out这个文件去
接下来的cout输出
就将信息都送到b.out文件里
就不送到显示器上了
那么当这一段输出内容
完成了以后
你觉得觉得又需要恢复
原来的标准输出的时候
你再次调用rdbuf
用原来暂存的这个pOld作参数
就可以把原来的标准输出
又恢复了
用这种办法呢
我们可以把三个标准输出流
对象的任何一个
进行重新定向
我们知道了要进行数据地输出
我们就要通过输出流对象
来完成这项工作
那么我们如何去构造
一个输出流对象呢
接下来我们就来看
构造输出流对象的语法
构造输出流对象
需要构造ofstream对象
这个类它支持磁盘文件地输出
那构造方法呢
可以选择不同的构造方法
一种呢就是
在构造函数中
我们直接指定一个文件名
这样的话当构造这个对象的时候
构造这个文件输出流对象的时候
这个对象就直接跟文件关联起来
而且这个文件
就自动打开了
我们也可以
在构造文件输出流对象的时候
不给文件名作初始化参数
就按照默认构造
比如这里构造一个myFile
但是不给它初始化参数
那这个时候呢
如果我们需要用这个对象
去向文件中输出任何东西的话
首先就要调用它的open方法
去打开一个指定的文件
打开的过程呢
这个流对象就跟文件关联起来了
这样我们也同样
可以用这个流对象
向文件中输出信息
不管我们是在构造流对象的时候
直接指定文件名
还是在事后打开文件
我们都可以指定打开文件的模式
比如说这个例子里面
我们用这个ios_base
它作用域里面的out
还有ios_base作用域里面的binary
这两个预定义好的常量
来指定文件打开模式
表示打开一个用于输出的文件
而且是个二进制文件
打开文件的时候的指定模式
有好多预定义的常量
这些常量也可以同时使用
需要同时使用的时候
用按位或运算符
把它连接在一起就可以了
那ofstream它是一个输出流类
这个类的对象
默认情况下
它打开就是为了输出的
所以呢
这个ios_base out不写也可以
默认的就是用了ios_base out
构造了文件输出流对象
将输出流对象
与文件关联起来以后
我们就可以通过这些对象
对文件进行操作了
那么怎么样通过文件输出流对象
向文件中写信息呢
很重要的就是
利用文件输出流提供的函数
那么文件输出流相关的函数呢
一共有三种
一种是与操纵符等价的成员函数
还有就是
执行非格式化写操作的成员函数
另外就是
其他的会修改流的状态
但是又不同于操纵符
或者插入运算符的
这样的成员函数
那么什么是操纵符呢
在后面例子中我们会看到的
这里列出了常用的
文件输出流的成员函数
open函数
我们在前面讲解中已经看到了
它可以将流
与一个特定的磁盘关键关联起来
使用open函数
去打开文件的时候呢
可以指定文件的打开模式
另外就是put函数
它可以将一个字符
写到输出流里面去
还有write函数
write函数是实现
低级的二进制写操作的函数
它可以把内存中的一块内容
以原样的二进制形式
直接写到文件输出流里面
那seekp和tellp函数呢
都是操作文件流内部指针的函数
seekp可以移动
文件流内部的写指针
我们知道
为什么我们每一次
不断地往文件里头写啊写啊
添加内容
这些内容不会覆盖原来的内容
会自动追加在文件尾呢
都是因为
在文件流内部隐含的有一个指针
它指向文件中下一个应该
写入的位置
那么我们用seekp呢
就可以移动这个指针的位置
这样可以指定
在文件的第多少个字节的位置
去写入信息
teelp函数呢
会返回当前这个
文件流内部指针的指向的位置
close函数是非常重要的
当我们打开了文件以后
可以对文件进行操作
但是完成了所有的操作
当我们不再需要
操作这个文件的时候
一定要记得及时关闭这个文件
关闭的时候呢
就要用到close函数
除此而外呢
还有错误处理函数
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义