菜狗的C++ primer读书笔记:第八章 IO库

1.标准库的IO类定义的iostream用于读写流的基本类型,fstream用于读写命名文件的类型,sstream用于读写内存string对象的类型。
2.为了支持使用宽字符,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始。宽字符版本的类型和对象与其对应的普通char版本的类型定义在同一个头文件中。
3.概念上,设备类型和字符大小都不会影响我们要执行的IO操作,标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。
4.我们不能拷贝或对IO对象赋值,由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。
5.置位是使变量某位为1,复位是使某位为0。
6.IO操作与生俱来的问题是可能发生错误,一些错误是可恢复的,而其他错误发生在系统深处,已经超过了应用程序可以修正的范围。IO类所定义的一些函数和标志,可以帮助我们访问和操纵流的条件状态。
7.一个流一旦发生错误,其上后续的IO操作都会失败,只有当流处于无错状态时,我们才可以对它读写数据。由于流可能处于错误状态,因此代码通常应该在使用一个流之前检查它是否处于良好的状态。
8.IO库定义了一个与机器相关的iostate类型,它提供了表达流状态的完整功能。IO库定义了4个iostate类型的constexpr值表示特定的位模式,这些值用来表示特定类型的IO条件,可以与位运算符一起使用来一次性检测或设置多个标志位。
9.badbit用来指出流已经崩溃,failbit用来指出一个IO操作失败了,eofbit用来指出流到达了文件结束,goodbit用来指出流未处于错误状态。如果badbit、failbit、eofbit任意一个被置位,则检测流状态的条件会失败。
10.标准库还定义了一组函数来查询这些标志位的状态。操作good在所有错误均未置位的情况下返回true,而bad、fail、eof则在对应错误位被置位时返回true。使用good和fail是确定流的总体状态的正确方法。实际上,我们将流当作条件使用的代码就等价于!fail()。而eof和bad操作只能表示特定的错误。
11.流对象的rdstate成员返回一个iostate值,对应流当前的状态;setstate操作将给定条件位置为,表示发生了对应错误;clear无参版本复位所有错误标志位,有参版本接受一个iostate值表示流的新状态。
12.每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合为单一的系统级写操作,这可以带来很大的性能提升。
13.导致缓冲刷新的原因:①程序正常结束②缓冲区满③使用操纵符显示刷新缓冲区④使用操纵符unitbuf设置流的内部状态(默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的)⑤一个流被关联到另一个流
14.endl:换行,刷新缓冲区
flush:刷新缓冲区
ends:输出空字符,刷新缓冲区
15.unitbuf告诉流在接下来的每次写操作之后都进行一次flush操作。而nounitbuf操纵符重置流,使其恢复使用正常的系统管理的缓冲区刷新机制。例如:cout << unitbuf 和 cout << nounitbuf
16.如果程序异常终止,输出缓冲区是不会被刷新的。当一个程序崩溃后,它所输出的数据很可能停留在输出缓冲区中等待打印。
17.当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。交互式系统通常应该关联输入流和输出流。(标准库将cin和cout关联到一起)
18.tie有两个重载的版本。
无参版本返回指向输出流的指针,如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针。
有参版本接受一个指向ostream的指针,将自己关联到此ostream,既可以将istream对象关联到一个ostream,也可将一个ostream关联到另一个ostream。为了解开流的关联我们可以传递一个空指针,每个流同时最多关联到一个流,但多个流可以同时关联到同一个ostream。
19.创建文件流对象时有三种方式:
fstream fstrm
fstream fstrm(s)
fstream fstrm(s,mode)
20.
fstrm.open(s)成员打开名为s的文件,并将fstrm与文件绑定,默认的文件mode依赖fstream的类型。s可以是一个string或者指向C风格字符串的指针。
fstrm.close()关闭与fstrm绑定的文件。
fstrm.is_open()返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭。
21.如果调用open失败,failbit就会置位,因为调用open可能失败,进行open是否成功的检测通常是一个好习惯。为了将文件流关联到另一个文件,必须首先关闭已经关联的文件。
22.当一个fstream对象被销毁时,close会被自动调用。
23.文件模式:
in :以读的方式打开
out:以写的方式打开
app:每次写操作前均定位到文件末尾
ate:打开文件后立即定为到文件末尾
trunc:截断文件
binary:以二进制方式进行IO
24.调用open打开文件时可以指定文件模式,用文件名初始化流来隐式打开文件时也可以。指定文件模式有如下限制:
①只可以对ofstream或fstream对象设定out模式
②只可以对ifstream或fstream对象设定in模式
③只有当out被设定时才可设定trunc模式
④只要trunc模式没被设定,就可设定app模式。在app模式下,即使没有显示设定out模式,文件也总是以写入模式被打开。
⑤默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截断。
⑥ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
每个文件流类型都定义了一个默认的文件模式,当未指定文件模式时,就使用此默认模式。
25.默认情况下,当我们打开一个ofstream时,文件的内容就会被丢弃,阻止一个ofstream清空给定文件内容的方法是同时指定app模式或者in模式。
26.
sstream strm :
sstream是头文件sstream中定义的一个类型
sstream strm(s) :
strm是一个sstream对象,保存string s的一个拷贝,此构造函数是explicit的
strm.str():
返回strm保存的string的拷贝
strm.str(s):
将string s 拷贝到strm中
27.当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream

你可能感兴趣的:(C++-Primer)