第八章 IO库学习笔记(第一遍阅读)
C++语言不直接处理输入输出,使用标准库来处理面向流的输入和输出。
- iostream处理控制台IO
- fstream处理命名文件I
- stringstream完成内存string的IO
类fstream和stringstream继承自类iostream,输入类继承自istream,输出类继承自ostream。
每个IO对象都维护一组条件状态,用来指出对象是否可以进行IO操作。标准库提供了一组函数,用来设置和检测这些状态。
术语:条件状态 文件模式 文件流 字符串流
IO类
三个头文件:
1. iostream
istream wistream 从流中读取数据
ostream wostream 向流中写入数据
iostream wiostream 读写流
2. fstream
3. stringstream
注意,标准库中也定义了一组类型和对象来草种wchar_t(宽字符)类型的数据。
IO对象无拷贝或赋值
不能拷贝或对IO对象赋值,进行IO操作的函数通常是以引用方式传递和返回流,读写IO对象会改变它的状态所以传递和返回的引用不能是const的。
条件状态
一个流一旦发生错误,其上后续的IO操作都会失败,在代码通常应该在使用一个流之前检查它是否处于良好的状态。
while (cin>>word)
//ok 读操作成功
IO类中定义了一些函数和标识,可以帮助我们查询和管理流的条件状态。
strm::iostate //提供了表达流状态的完整功能,应作为一个为集合来使用,与位运算符一起使用可以一次性检测多个标志位
strm::badbit //流已经崩溃 (系统级错误)
strm::failbit //流操作失败
strm::eofbit //流达到了文件结束
strm::goodbit //刘伟处于错误状态
s.eof()//若流的eofbit置位则返回true
s.fail()
s.good()
s.clear()//将流的所有条件状态位复位,将流的状态设置为有效。
s.clear(flags)
s.setstate(flags)
s.rdstate()
cin.clear(cin.rdstate()&~cin.failbit&~cin.batbit);
//复位failbit和badbit位 其他位保持不变
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
刷新输出缓冲区:
endl 换行 刷新
flush 刷新
ends 空字符 刷新
unitbuf 每次写操作后都进行一次flush
nounitbut 回到正常缓冲方式
*如果程序崩溃,输出缓冲区不会被刷新
文件输入输出
头文件:fstream
三个类型:ifstream ofstream fstream
除继承自iostream类型的行为fstream增加了新的成员管理与流关联的文件
fstream fstrm;
fstream fstrm(s);
fstream fstrm(s,mode);
fstrm.open(s);
fstrm.close();
fstrm.is_open();
文件模式
in %读方式打开
out %写方式打开
app %每次写都定位到文件末尾
ate %打开文件后立即定位到文件末尾
trunc %截断文件
binary %以二进制方式进行IO
ate 和binary模式可用于任何类型的文件流对象,可以与其他类型模式组合使用。
String流
头文件:sstream
三个类型:istringstream ostringstream stringstream
sstream strm;
sstream strm(s); % strm是一个sstream的对象,保存strings s的一个拷贝
strm.str(); % 返回strm所保存的string考办
strm.str(s); % 将string s拷贝到strm中