8.1 IO库
上表中以w开头的类型和函数是C++标准库为了支持使用宽字符的语言而定义的一组类型和对象来操纵wchar_t类型的数据.
(然而我没有遇到过)
8.1.1 IO对象无拷贝或赋值
IO对象不能拷贝或赋值,通常用引用方式传递和返回流,由于读写一个IO对象回改变其状态,因此传递和返回的引用不能是const.
8.1.2条件状态
IO类定义一些函数和标志帮助我们访问和操纵流的条件状态:
badbit表示系统级错误,一般badbit被置位,流就无法使用.
failbit被置位表示期望读取数值却读出一个字符等错误.这种问题可以修正.
如果读取文件达到文件结束位置,eofbit和failbit都会被置位.
以上三种任何一个被置位都会导致检测流状态的条件失败.
8.1.3管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据.缓冲区不刷新,数据就会一直停留在缓冲区.
导致缓冲区刷新的原因通常有以下几种:
程序正常结束.
缓冲区满时.
endl等操纵符显式刷新缓冲区.
一个输出流关联另一个流,当读写被关联的流时,关联的流的缓冲区会被刷新.
刷新缓冲区的操纵符:
cout<<"hello world"<<endl; //输出一个换行然后刷新缓冲区.
cout<<"hello world"<<flush; //直接刷新缓冲区.
cout<<"hello world"<<ends; //输出一个空字符然后刷新缓冲区.
使用tie可以关联两个流对象.标准库默认将cout和cin关联在一起.
cin.tie(&cout); //将cin和cout关联在一起(标准库已经默认这么干了).
cin.tie(); //不带参数则返回指向关联的流的指针,没有关联的流则返回void
8.2文件输入输出
头文件fstream定义了三个类型来支持文件的输入输出:
ifstream:从给定文件读取数据.
ofstream:从给定文件写入数据.
fstream:既可以读取又可以写入.
//文件输出流程:
ofstream ofs; //创建流对象
ofs.open(文件路径,打开方式) //给流对象绑定文件
//以上两步可以合为一步: ofstream ofs(文件路径,打开方式)
ofs<<输入的内容 //输入数据
ofs.close() //关闭流对象
//文件输入流程:
ifstream ifs; //创建流对象
ifs.open(文件路径,打开方式) //给流对象绑定文件
ifs>>接收数据的数组 //读取数据
ifs.getline(接收数据的数组,所要读取的字符数) //读取数据
getline(ifs,接收数据的字符串) //这里需要的是字符串,并且需要#include<string>
ifs.get() //读取单个char.
ifs.close() //关闭流对象
如果文件流对象被创建在一个作用域内(例如在循环体里),那么出了作用域则文件流对象被销毁,close()会自动被调用.
8.2.2文件模式![](https://i-blog.csdnimg.cn/blog_migrate/a2a034a4b7152a587d0adc35094349d6.png)
未指定文件打开模式时,ifstream默认以in模式打开,ofstream默认以out模式打开,fstream默认以in|out模式打开(多种模式可以用(或)|来连接表示用多种方式打开文件).
以out模式打开文件,会清空原文件内容.
8.3 string流
头文件sstream定义三个类型来支持内存IO,可以把字符串当作一个IO流来使用.
istringstream:从stream读取数据
ostringstream:向string写入数据
stringstream:可读可写
头文件sstream继承自iostream,所以对于iostream的操作可以用在sstream上.