c++primer 第八章(未完)
IO库
c++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等
istream(输入流)类型,提供输入操作
ostream (输出流)类型,提供输出操作
cin,一个istream对象,从标准输入读取数据
cout,一个ostream对象,向标准输出写入操作
cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
>>运算符,用来从一个istream对象读取输入数据
<<运算符,用来向一个ostream对象写入输出数据
getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中
IO类
IO对象无拷贝或赋值(不能进行任何拷贝和赋值操作)
进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的
条件状态
IO 操作一个与生俱来的问题是可能发生错误。一些错误是可恢复的,而其他错误则发生在系统深处,已经超出了程序可以修正的范围
IO库的条件状态
strm::iostate strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit strm::badbit用来指出流已崩溃
strm::failbit strm::failbit用来指出一个IO操作失败了
strm::eofbit strm::eofbit用来指出流到达了文件结束
strm::goodbit strm::goodbit用来指出流末处于错误状态。此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流的failbit或badbit置位,则返回true
s.bad() 若流的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s的所有条件状态位复位,将流的状态设置为有效。返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate
eg://记住当前cin的当前状态
auto old_state = cin.rdstate();
cin.clear(); //复位流的所有条件状态位,使流有效
process_input(cin); //使用cin
cin.setstate(old_state); //将cin置为原有状态
//复位failbit和badbit,保持其他标志位不变
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
1 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
2 缓冲区满时,需要刷新缓冲区,而后新的数据才能继续写入缓冲区
3 可以使用操作符如endl来显示刷新缓冲区
4 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
5 一个输出流可能被关联到另一个流。在这种情况下当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout。因此,读cin
或写cerr都会导致cout的缓冲区刷新
刷新输出缓冲区:
endl,ends,flush都可以刷新缓冲区
endl: 完成换行并刷新缓冲区
ends: 向缓冲区插入一个空字符,然后刷新缓冲区
flush: 刷新缓冲区
unitbuf操纵符
如果想在每次输出操作之后都刷新缓冲区,可以使用unitbuf操纵符。它告诉流在接下来的每次写操作之后都进行一次flush操作;
nounitbuf操纵符
重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
eg:
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf; //恢复正常的缓冲机制
重要:如果程序崩溃,输出缓冲区不会被刷新
关联输入和输出流
当结果输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。标准库将cout和cin关联在一起,因此 cin>>ival;导致cout缓冲区被刷新 (意思就是在你写之前先把缓冲区的内容打印出来)
流关联设置
tie有两个重载版本:
x.tie(); //返回指向输出流指针 ,如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针
x.tie(ostream *); //将自己关联到此ostream.即 x.tie(&o) 将流x关联到输出流
既可以将一个istream对象关联到另一个ostream,也可以将一个ostream关联到另一个ostream;
eg: cin.tie(&cout); //将cin和cout关联在一起
ostream *old_tie = cin.tie(nullptr); //cin不再与其他流关联
cin.tie(&cerr); //读取cin会刷新cerr而不是cout
cin.tie(old_tie); //重建cin和cout件的正常关联
注:每个流同时最多可以关联一个流,但多个流可以同时关联到一个流
文件输入输出
头文件fstream定义了三个类型来支持文件IO:
1 ifstream 从一个给定文件读取数据
2 ofstream 向一个给定文件写入数据
3 fstream 可以读写给定文件
fstream、ifstream、和ofstream操作,不能对其他IO类型调用这些操作
fstream特有操作
fstream fstm 创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s); 创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向c风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
fstream fstrm(s,mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s); 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件mode依赖于fstream的类型,返回void
fstrm.close(); 关闭于fstrm绑定的文件。返回void
fstrm.is_open(); 返回一个Bool值,指出于fstrm关联的文件是否成功打开且尚为关闭
使用文件流对象
在新c++标准中,文件名既可以是库类型string对象,也可以是c风格字符数组。
#C/C++#
c++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等
istream(输入流)类型,提供输入操作
ostream (输出流)类型,提供输出操作
cin,一个istream对象,从标准输入读取数据
cout,一个ostream对象,向标准输出写入操作
cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误
>>运算符,用来从一个istream对象读取输入数据
<<运算符,用来向一个ostream对象写入输出数据
getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中
IO类
IO对象无拷贝或赋值(不能进行任何拷贝和赋值操作)
进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的
条件状态
IO 操作一个与生俱来的问题是可能发生错误。一些错误是可恢复的,而其他错误则发生在系统深处,已经超出了程序可以修正的范围
IO库的条件状态
strm::iostate strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit strm::badbit用来指出流已崩溃
strm::failbit strm::failbit用来指出一个IO操作失败了
strm::eofbit strm::eofbit用来指出流到达了文件结束
strm::goodbit strm::goodbit用来指出流末处于错误状态。此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流的failbit或badbit置位,则返回true
s.bad() 若流的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s的所有条件状态位复位,将流的状态设置为有效。返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate
eg://记住当前cin的当前状态
auto old_state = cin.rdstate();
cin.clear(); //复位流的所有条件状态位,使流有效
process_input(cin); //使用cin
cin.setstate(old_state); //将cin置为原有状态
//复位failbit和badbit,保持其他标志位不变
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
1 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
2 缓冲区满时,需要刷新缓冲区,而后新的数据才能继续写入缓冲区
3 可以使用操作符如endl来显示刷新缓冲区
4 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
5 一个输出流可能被关联到另一个流。在这种情况下当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin和cerr都关联到cout。因此,读cin
或写cerr都会导致cout的缓冲区刷新
刷新输出缓冲区:
endl,ends,flush都可以刷新缓冲区
endl: 完成换行并刷新缓冲区
ends: 向缓冲区插入一个空字符,然后刷新缓冲区
flush: 刷新缓冲区
unitbuf操纵符
如果想在每次输出操作之后都刷新缓冲区,可以使用unitbuf操纵符。它告诉流在接下来的每次写操作之后都进行一次flush操作;
nounitbuf操纵符
重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
eg:
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf; //恢复正常的缓冲机制
重要:如果程序崩溃,输出缓冲区不会被刷新
关联输入和输出流
当结果输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。标准库将cout和cin关联在一起,因此 cin>>ival;导致cout缓冲区被刷新 (意思就是在你写之前先把缓冲区的内容打印出来)
流关联设置
tie有两个重载版本:
x.tie(); //返回指向输出流指针 ,如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针
x.tie(ostream *); //将自己关联到此ostream.即 x.tie(&o) 将流x关联到输出流
既可以将一个istream对象关联到另一个ostream,也可以将一个ostream关联到另一个ostream;
eg: cin.tie(&cout); //将cin和cout关联在一起
ostream *old_tie = cin.tie(nullptr); //cin不再与其他流关联
cin.tie(&cerr); //读取cin会刷新cerr而不是cout
cin.tie(old_tie); //重建cin和cout件的正常关联
注:每个流同时最多可以关联一个流,但多个流可以同时关联到一个流
文件输入输出
头文件fstream定义了三个类型来支持文件IO:
1 ifstream 从一个给定文件读取数据
2 ofstream 向一个给定文件写入数据
3 fstream 可以读写给定文件
fstream、ifstream、和ofstream操作,不能对其他IO类型调用这些操作
fstream特有操作
fstream fstm 创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s); 创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向c风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
fstream fstrm(s,mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s); 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件mode依赖于fstream的类型,返回void
fstrm.close(); 关闭于fstrm绑定的文件。返回void
fstrm.is_open(); 返回一个Bool值,指出于fstrm关联的文件是否成功打开且尚为关闭
使用文件流对象
在新c++标准中,文件名既可以是库类型string对象,也可以是c风格字符数组。
#C/C++#
查看16道真题和解析