🎉作者简介:👓
博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢
c
+
+
,
g
o
,
p
y
t
h
o
n
,
目前熟悉
c
+
+
,
g
o
语言,数据库,网络编程,了解分布式等相关内容
\textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容}
博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容 📃
个人主页:
\textcolor{gray}{个人主页:}
个人主页: 小呆鸟_coding 🔎
支持
:
\textcolor{gray}{支持:}
支持:
如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦
\textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦}
如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦👍
就是给予我最大的支持!
\textcolor{green}{就是给予我最大的支持!}
就是给予我最大的支持!🎁 💛本文摘要💛
本专栏主要是对c++ primer这本圣经的总结,以及每章的相关笔记。目前正在复习这本书。同时希望能够帮助大家一起,学完这本书。 本文主要讲解第8章 IO类 |
- 本章主要介绍函数传参及函数返回结果、函数重载、重载函数应该选择哪个进行调用。
💕8.1 IO类
??8.1.0前面章节使用的IO库
- istream:输入流类型,提供输入操作。
- ostream:输出流类型,提供输出操作
- cin:一个
istream 对象,从标准输入读取数据。 - cout:一个
ostream 对象,向标准输出写入数据。 - cerr:一个
ostream 对象,向标准错误写入消息。 - >>运算符:用来从一个
istream 对象中读取输入数据。 - <<运算符:用来向一个
ostream 对象中写入输出数据。 - getline函数:从一个给定的
istream 对象中读取一行数据,存入到一个给定的string 对象中。
| IO库类型和头文件 |
---|
头文件 | 类型 | | istream, wistream(从流中读取) | iostream | ostream,wostream(写到流中去) | | iostream,wiostream(对流进行读写) | | | | ifstream,wifstream(从文件中读取) | fstream | ofstream,wofstream(写到文件中去) | | fstream,wfstream(读写文件) | | | | istringstream, wistringstream(从string对象中读取) | sstream | ostringstream, wostringstream(写到string对象中去) | | stringstream, wstringstream(对string对象进行读写) |
- 其中带
w 前缀 的类型用来操作宽字符语言 (wchar_t)。宽字符版本的类型和函数前都有一个 w,如 wcin, wcout, wcerr。 fstream 和 sstream 中的类型都继承自 iostream 中的类型。- 可以将一个派生类对象当成基类对象来使用。
- 所有这些输入输出流对象的
>> 操作都是读取一个单词 。
理解:
输入流 和输出流 都是流对象 ,输入流就是要用 >> 把流对象中的内容保存到变量中,输出流就是要用<< 把变量保存到流对象 中。一个流是和控制台窗口或一个文件或字符串等相关联的,如 cin、cout 都和控制台窗口 相关联。
??8.1.1 IO对象无拷贝或赋值
- IO对象不能存在容器里.
不能拷贝或对 IO 对象赋值 形参或返回类型不能设置成流类型。 - 进行 IO 操作的函数通常
以引用形式传递和返回流 。(形参和返回类型一般是流的引用。) - 读写 IO 对象会改变其状态,因此引用不能是 const 的。
??8.1.2 条件状态
- IO操作可能会发生不可预知的错误,一些错误是课恢复的,一些操作是不可恢复的,
我们在使用一个流之前,应该检查它是否处于良好状态。 条件状态用来查看流状态
IO 库的状态
状态 | 解释 |
---|
strm:iostate | 作为位集合来使用,可以表达流的完整状态。通过位运算符可以一次性检测或设置多个标志位。 | `strm:badbit | 表示流已崩溃,是系统及错误或不可恢复的读写错误。流无法再使用。 | strm:failbit | 表示一个 IO 操作失败了,是可恢复错误。修正后流可以继续使用。 | strm:eofbit | 用来指出流到达了文件结束 | strm:goodbit | 用来指出流未处于错误状态,此值保证为零 | s.eof() | 若流s 的eofbit 置位,则返回true | s.fail() | 若流s 的failbit 置位,则返回true | s.bad() | 若流s 的badbit 置位,则返回true | s.good() | 若流s 处于有效状态,则返回true | s.clear() | 将流s 中所有条件状态位复位,将流的状态设置成有效,返回void | s.clear(flags) | 将流s 中指定的条件状态位复位 ,返回void | s.setstate(flags) | 根据给定的标志位,将流s 中对应的条件状态位置位 ,返回void | s.rdstate() | 返回流s 的当前条件状态,返回值类型为strm::iostate |
检查流的状态
while(cin >> word);
while(cin.good());
while(!cin.fail());
管理条件状态
cin.rdstate();
cin.setstate(state);
cin.clear();
cin.clear(state);
设置某个标志位的方式
cin.clear(cin.rdstate() & ~cin.failbit);
??8.1.3 管理输出缓冲区
每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。
缓冲刷新(即数据真正写到设备或文件)的原因:
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
- 缓冲区满
- 使用操纵符如
endl , flush , ends 来显示刷新缓冲区 - 一个输出流可能关联到另一个流。
当读写被关联的流时,关联到的流的缓冲区就会被刷新 如读 cin 或写 cerr 都会刷新 cout 的缓冲区 - 使用操纵符
unitbuf 设置流的内部状态来清空缓冲区。
操纵符 endl, flush, ends unitbuf:告诉流接下来每次写操作之后都进行一次 flush 操作 nounitbuf:重置流,恢复正常的刷新机制
注意:如果程序异常终止,将不会刷新缓冲区,即此时相应的输出操作已执行但没有打印。
关联输入和输出流
当一个输入流关联到一个输出流,每次从该输入流读取数据前都会先刷新关联的输出流。 标准库将 cin 和 cout 关联在一起 。
cout << "我是小呆鸟";
cin >> ival;
输入流的成员函数 tie 可以用来查看关联的输出流或关联到输出流:
cin.tie();
cin.tie(&cerr);
cin.tie(NULL);
每个流最多关联到一个输出流,但一个输出流可以被多个流关联。
💕8.2 文件输入输出
操作 | 解释 |
---|
fstream fstrm; | 创建一个未绑定的文件流。 | fstream fstrm(s); | 创建一个文件流,并打开名为s 的文件,s 可以是string 也可以是char 指针 | fstream fstrm(s, mode); | 与前一个构造函数类似,但按指定mode 打开文件 | fstrm.open(s) | 打开名为s 的文件,并和fstrm 绑定 | fstrm.close() | 关闭和fstrm 绑定的文件 | fstrm.is_open() | 返回一个bool 值,指出与fstrm 关联的文件是否成功打开且尚未关闭 |
上表中,fstream 是头文件fstream 中定义的一个类型,fstrm 是一个文件流对象。
??8.2.1 使用文件流对象
- 当想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来
fstream 定义和初始化
fstream fs;
fstream fs('data.txt');
fstream fs('data.txt', mode);
fstream 特有操作
getline(ifs, s);
fs.open('data.ext');
fs.close();
fs.is_open();
- 当定义了一个空的文件流对象,使用 open 函数将其与文件关联并打开文件。
- 如果 open 失败,failebit 会被置位,
建议每次 open 后检测 open 是否成功 。 - 不能对已打开的文件流调用 open。
当文件关闭后,可以将文件流关联到另一个文件 。- 当一个
fstream 对象被销毁时,close 函数会自动被调用。
用 fstream 代替 iostream
- 使用 iostream 类型的引用作为函数参数的地方,都可以使用 fstream 来代替。(在使用基类型对象的地方,也可以用继承类型的对象文件)
可以与p229页程序做对比
自动构造和析构
??8.2.2 文件模式
- 每次打开文件都以某种模式打开,如未指定即以该文件流类型的默认模式打开。
- 每个流都有一个关联的文件模式,用来指出如何使用文件
文件模式 | 解释 |
---|
in | 以读的方式打开 | out | 以写的方式打开 | app | 每次写操作前均定位到文件末尾 | ate | 打开文件后立即定位到文件末尾 | trunc | 截断文件 | binary | 以二进制方式进行IO操作。 |
文件模式的使用
- 每个流对象都有默认的文件模式,ifstream 默认 in 模式打开文件,ofstream 默认 out,fstream 默认 in 和 out。
对 ifstream 对象不能设置 out 模式,对 ofstream 对象不能设置 in 模式 - 只有设置了 out 才能设置 trunc 模式,只设置 out 模式会默认也设置 trunc 模式
- 设置了 trunc 就不能再设置 app 模式
默认情况下以 out 模式打开文件会使文件内容被清空,如果要保留文件内容需要同时指定 app 模式或 in 模式。 app 模式下,会将写入的数据追加写到文件末尾
💕8.3 string流
-
从string读写数据,就像string是一个IO流一样 -
stringstream 继承了iostream 但是自己也有一些独特的操作 -
头文件sstream 定义了三个类型来支持内存IO:
istringstream 从string 读取数据。ostringstream 向string 写入数据。stringstream 可以读写给定string 。
string的一些操作
操作 | 解释 |
---|
sstream strm | 定义一个未绑定的stringstream 对象 | sstream strm(s) | 定义一个 stringstream 对象 strm ,strm 中保存着 string s 的拷贝。 | strm.str() | 返回strm 所保存的str 的拷贝 | strm.str(s) | 将 string s 拷贝到strm 中,返回 void |
istringstream 作为数据源,将line 的内容拷贝到istringstream 流里面去,绑定刚读入的行。- 此时张三和电话就保存到了流中,在通过流把张三和电话存起来。
??8.3.2 使用ostringstream
可以想象成cin 和 cout ,只不过cin 和cout 的操作对象是控制台.
istringstream 是输入流,即读操作,要将流中的内容输入到字符串中,因此定义和使用 istringstream 时流内必须有内容,所以在使用前要提前在流内保存一个字符串 ostringstream 是输出流,即写操作,将流中的内容输出到字符串中,ostringstream 可以在定义时即在流中保存一个字符串,也可以通过 << 操作符获得字符串 。
|