清华郑莉C++语言程序设计学习笔记(6)- 流类库与输入/输出、异常处理

10 篇文章 7 订阅

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

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

当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。
:是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
流对象与文件操作:程序建立一个流对象,指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所链接的文件对象产生作用。
提取与插入:读操作在流数据抽象中被称为从流中提取,写操作被称为向流中插入。

11.2 输出流

11.2.1 输出流概述

最重要的三个输出流: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打开文件时可以指定模式

ofsteam myFile("filename", ios_base::out|ios_base::binary);

文件输出流成员函数的三种类型:与操作符等价的成员函数、执行非格式化写操作的成员函数、其它修改流状态且不同于操作符或插入运算符的成员函数
文件输出流成员函数
open():把流与一个特定的磁盘文件关联起来,需要指定打开模式
put():把一个字符写到输出流中
write():将内存中的一块内容写到一个文件输出流中
seekp()tellp():操作文件流的内部指针
close():关闭与一个文件输出流关联的磁盘文件
错误处理函数:在写到一个流时进行错误处理

11.2.2 向文本文件输出

插入运算符<<:为所有标准C++数据类型预先设计的,用于传送字节到一个输出流对象。
操纵符(manipulator)
1、插入运算符与操纵符一起工作,控制输出格式。
2、很多操纵符都定义在ios_base类中(如hex控制进制)、头文件(如setprecision()控制精度)。
3、控制输出宽度:在流中放入setw()操纵符或调用width()成员函数为每个项指定输出宽度。setw()width()仅影响紧随其后的输出项,但其它流格式操纵符保持有效直到发生改变。
4、dec、oct和hex操纵符设置输入和输出的默认进制。
在这里插入图片描述
setiosflags操纵符:
1、在这个程序中,通过使用带参数的setiosflags操纵符来设置左对齐,setiosflags定义在头文件iomanip中。
2、参数ios_base::left是ios_base的静态常量,因此引用时必须包括ios_base::前缀。
3、这里需要用resetiosflags操纵符关闭左对齐标志。setiosflags不同于width和setw,它的影响是持久的,直到用resetiosflags重新恢复默认值时为止。
4、setiosflags的参数是该流的格式标志值,可用按位或(|)运算符进行组合。
setiosflags参数(流的格式标识):
在这里插入图片描述
精度
1、浮点数输出精度的默认值是6,例如3466.98,要改变精度使用setprecision操纵符(定义在头文件iomanip中)。
2、如果不指定fixed或scientific,精度值表示有效数字位数。
3、如果设置了ios_base::fixed或ios_base::scientific精度值表示小数点之后的位数。
在这里插入图片描述
在这里插入图片描述

11.2.3 向二进制文件输出

二进制文件流
1、使用ofstream构造函数中的模式参量指定二进制输出模式。
2、以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式。
3、通过二进制文件输出流对象完成输出。
在这里插入图片描述

11.2.4 向字符串输出

字符串输出流ostringstream:用于构造字符串,支持ofstream类的除open、close外的所有操作,str函数可以返回当前已构造的字符串。
典型应用:将数值转换为字符串。
在这里插入图片描述

11.3 输入流

11.3.1 输入流概述

重要的输入流类:
1、istream类最适合用于顺序文本模式输入,cin是其实例。
2、ifstream类支持磁盘文件输入。
3、istringstream
构造输入流类对象:如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开

ifstream myFile("filename");

在调用默认构造函数之后使用open函数来打开文件

ifstream myFile; //建立一个文件流对象
myFile.open("filename"); //打开文件”filename“

打开时可以指定模式

ifstream myFile("filename",ios::base::in | ios_base::binary);

使用提取运算符>>从文本文件输入
1、提取运算符>>对于所有标准C++数据类型都是预先设计好的,是从一个输入流对象获取字节最容易的方法。
2、ios类中的很多操纵符都可以应用于输入流,但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec、oct和hex。
输入流相关函数
open():把流与一个特定磁盘文件相关联。
get():功能和提取运算符>>很像,主要的不同点是get函数在读入数据时包括空白字符
getline():从输入流中读取多个字符,并且允许指定输入终止字符,读取完成后,从读取的内容中删除终止字符。
read():二进制读,从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。当遇到文件结束或者在文本模式中遇到文件结束标记字符时读取结束。
seekg():用来设置文件输入流中读取数据位置的指针。
tellg():返回当前文件读指针的位置。
close():关闭与一个文件输入流关联的磁盘文件。

11.3.2 输入流应用举例

在这里插入图片描述
指定读取字符串的终止符:
在这里插入图片描述
二进制方式从文件读取一个以前写的文件,放到结构体对象中
在这里插入图片描述
在这里插入图片描述
用seekg函数移动文件位置指针:
在这里插入图片描述
用tellg取出当前读指针的位置:
在这里插入图片描述

11.3.3 从字符串输入

字符串输入流istringstream:用于从字符串读取数据,在构造函数中设置要读取的字符串。功能:支持ifstream类的除open、close之外的所有操作。典型应用:将字符串转换为数值。
在这里插入图片描述

11.4 输入/输出流

两个重要的输入/输出流:一个iostream对象可以是数据的源或目的。两个重要的I/O流类都是从iostream派生的,它们是fstream和stringstream。这些类继承了前面描述的istream和ostream类的功能。
fstream类:支持磁盘文件的输入和输出。
1、如果需要在同一个程序中从一个特定磁盘文件读并写到该磁盘文件,可以构造一个fstream对象。
2、一个fstream对象是有两个逻辑子流的单个流,两个子流一个用于输入,另一个用于输出。
stringstream类:支持面向字符串的输入和输出。可以用于对同一个字符串内容交替读写,同样是由两个逻辑子流构成。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十二章 异常处理

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

异常处理的基本思想
在这里插入图片描述
异常处理的语法
抛掷异常的程序段:

throw 表达式;

捕获并处理异常的程序段:

try
	复合语句
catch(异常声明)
	复合语句
catch(异常声明)
	复合语句

1、若有异常则通过throw创建一个异常对象并抛掷,将可能抛出异常的程序段嵌在try块之中,通过正常的顺序执行到try语句,然后执行try块内的保护段。
2、如果在保护段执行期间没有引起异常,那么跟在try块后的catch语句就不执行,程序从try块后的最后一个catch子句后面的语句继续执行。
3、catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
4、如果匹配的处理器未找到,则库函数terminate将被自动调用,其缺默认能是调用abort终止程序。
在这里插入图片描述
异常接口声明
1、在函数的声明中列出这个函数可能抛掷的所有异常类型,有利于函数的调用者为异常处理做好准备。例如:void fun() throw(A,B,C,D);
2、若无异常接口声明,则此函数可以抛掷任何类型的异常。
3、不抛掷任何类型异常的函数声明:void fun() throw()

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

自动的析构:找到一个匹配的catch异常处理后,初始化异常参数,将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构,从最后一个catch处理之后开始恢复执行。
在这里插入图片描述
在这里插入图片描述

12.3 标准程序库异常处理

标准异常类的继承关系
在这里插入图片描述
在这里插入图片描述
标准异常类的基础
exception:标准程序库异常类的公共基类。
logic_error:可以在程序中被预先检测到的异常。如果小心地编写程序,这类异常能够避免。
runtime_error:难以被预先检测的异常。

例:计算三角形面积
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值