点击下载PDF版(极力推荐)

C++程序设计基础 第十二章.pdf

前言

本文档由 @ItsJiale 创作,作者博客:https://jiale.domcer.com/,作者依据数学与大数据学院 2024 级大数据教学班的授课重点倾向编写而成。所有内容均为手动逐字录入,其中加上了不少自己的理解与思考,耗费近一周时间精心完成。

此文档旨在助力复习 C++ 程序设计基础,为后续学习数据结构筑牢根基。信计专业的同学,也可参考本文档规划复习内容。需注意,若个人学习过程中存在不同侧重点或对重难点的理解有差异,应以教材内容为准。倘若文档内容存在任何不妥之处,恳请各位读者批评指正。

By:ItsJiale

2025.5.5

第十二章 I/O流

12.1 I/O流类库

I/O流库是C++标准库的重要组成部分,它主要包括ios类库和streambuf类库。其中,ios类库提供流的高级I/O操作,streambuf类库主要负责缓冲区的处理。

12.1.1 ios类库

ios类库以ios类为根基类,ios类是一个抽象类(包含纯虚函数的类叫做抽象类),提供了输入/输出所需的公共接口,如设置数据流格式、错误状态恢复、设置文件的输入/输出模式等。ios类库层次结构如下

ios类库层次结构.png

抽象基类ios类派生了2个类:istream类和ostream类。istream类和ostream类是输入输出流类,定义了输入流和输出流的基本特性。istream类和ostream类又派生了其他类。

ios类库中各个类的含义与功能如下所示:

● ifstream类:文件输入流类,支持文件的读取操作。

● istringstream类:字符串输入流类,支持字符串的输入操作。

● ofstream类:文件输出流类,支持文件的写入操作。

● ostringstream类:字符串输出流类,支持字符串的输出操作。

● fstream类:文件输入/输出流类,支持文件的读取和写入操作。

● stringstream类:字符串输入/输出流为,支持字符串输入和输出操作。

12.1.2 streambuf类库

streambuf类库以streambuf为根基类,streambuf类是一个抽象类,提供了缓冲区操作接口,如设置缓冲区、从缓冲区提取字节、向缓冲区插入字节等。 streambuf类库层次结构如下图。

streambuf类库层次结构.png

12.2 标准I/O流

12.2.1 预定义流对象

C++提供了4个预定义流对象:cincoutcerrorclogcinistream类的对象,用于处理标准输入(键盘输入)。coutcerrorclogostream类的对象,cout用于处理标准输出(屏幕输出);cerrclog用于处理标准错误信息。

对象名所属类对应设备含义
cinistream键盘标准输入,有缓冲
coutostream屏幕标准输出,有缓冲
cerrostream屏幕标准错误输出,无缓冲
clogostream屏幕标准错误输出,有缓冲

12.2.2 标准输出流

ostream预定义了三个输出流对象coutcerrclog,而且还重载了运算符“<<”,输出流对象与“<<”运算符结合使用,可以输出各种类型的数据。此外,ostream类还提供了成员函数输出数据,比较常用的两个函数为put()函数和write()函数。

put()函数

put()函数用于输出单个字符,其声明如下所示:

ostream& put(char ch);

在上述声明中,参数ch表示要输出的字符,函数返回值为ostream类对象引用。put()函数的作用是将字符插入到输出流对象,通过输出流对象将字符输出到指定位置。

由于put()函数返回的是输出流对象,因此put()函数与输出运算符“<<”一样,可以连续调用

cout.put('a'); //输出字符a

cout.put('\n'); //输出换行符

cout.put(‘d’).put(‘h’); //连续调用put()函数,输出‘ d’、‘h’

write()函数

write()函数用于输出一个字符串,其声明如下所示:

ostream& write(const char* str, streamsize count);

在上述声明中,第一个参数str表示字符串,第二个参数count表示输出的字符个数,需要注意的是,streamsizelong long类型的重定义。write()函数返回值为ostream类对象引用,其作用是将指定个数的字符串插入到输出流对象,通过输出流对象将字符串输出到指定位置。write()函数也可以连续调用

cout.write("I love China",6);

cout.write("I love China",6).write("I love China",5);

在上述代码中,第一行代码调用write()函数输出字符串"I love China"的前6个字符;第二行代码连续调用write()函数输出字符串"I love China"的前6个和前5个字符。

还是那句话,会用就行

12.2.3 标准输入流

istream类预定义了输入流对象cin,并且重载了运算符“>>”,输入流对象与“>>”运算符结合使用,可以输入各种类型的数据。此外,istream类还提供了成员函数输入数据,如get()函数、getline()函数、read()函数等。

get()函数

get()函数用于从输入流中获取单个字符,istream类提供了get()函数的三种重载形式。

(1)读取单个字符

从流中读取单个字符的get()函数有两种重载形式,具体如下所示:

int get(); //第一种形式

istream& get(char& ch); //第二种形式

上述函数声明中,第一种形式没有参数,返回值为int类型,函数的作用是从输入流读取一个字符,返回该字符的ASCII码值。第二种形式有一个char类型的引用作为参数,返回值为istream类对象引用。函数的作用是从输入流读取一个字符存储到ch中。

最后修改:2025 年 05 月 05 日
如果觉得我的文章对你有用,请随意赞赏