# IO 我们不能限制实际应用程序仅从控制台窗口进行IO操作,应用程序常常需要读写命名文件。跟IO相关的主要有三个头文件。 | 头文件 | 类型 | | ---------- | ------------------------------- | | `iostream` | `istream, wistream` | | | `ostream, wostream` | | | `iostream, wiostream` | | `fstream` | `ifstream, wifstream` | | | `ofstream, wofstream` | | | `fstream, wfstream` | | `sstream` | `istringstream, wistringstream` | | | `ostringstream, wostringstream` | | | `stringstream, wstringstream` | 继承机制可以让我们不用考虑不同类型之间的差异。需要注意的是这些IO对象无拷贝和赋值的操作,所以我们不能对一个流对象进行赋值,我们也不能将流对象放入到函数形参中,我们也不能将函数的返回值设置为流对象。 ## 输入输出流 ### 输入状态 | 条件状态 | 说明 | | ----------------- | ---------------- | | strm::iostate | 完整条件状态功能 | | strm::badbit | | | strm::failbit | | | strm::eofbit | | | strm::goodbit | | | s.eof() | | | s.fail() | | | s.bad() | | | s.good() | | | s.clear() | | | s.clear(flags) | | | s.setstate(flags) | | | s.rdstate() | | ### 管理输出缓冲区 三种操作符: - `std::endl` 换行并刷新缓冲区。 - `flush` 刷新缓冲区但不输出任何额外的字符。 - `ends` 向缓冲区插入一个空字符,然后刷新缓冲区。 如果想在每次输出操作后都刷新缓冲区,可以使用 `unitbuf` 操作符。他设置流对象在接下来的每次写操作之后都进行一次 `flush` 操作,而 `unitbuf` 操作符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制。 ```c++ cout << unitbuf; //所有输出操作后都会立即刷新缓冲区 cout << nounitbuf; //回到正常的缓冲方式 ``` ## 输入输出文件 头文件 `fstream` 定义了三个类型来支持文件IO。`ifstream` 从一个给定文件读取数据,`ofstream` 向一个给定文件写入数据,`fstream` 可以读写给定的文件。除了 `iostream` 类型的行为之外,`fstream` 中定义的类型还增加了一些新的成员来管理与流相关的文件。我们可以对 `fstream` 、`ifstream`、`ofstream` 对象调用这些操作。 ```c++ fstream fstrm; //创建一个未绑定的文件流,fstream是头文件fstream中定义的类型 fstream fstrm(s); //创建一个对象,并打开一个名为s的文件。s可以是string类型,或者是一个指向C风格字符串的指针。构造函数都是explicit,默认的文件模式mode依赖于fstream类型。 fstream fstrm(s, mode); //与上面一个一样,但是按指定mode打开文件 fstrm.open(s); //打开名为s的文件,并将文件与fstrm绑定。s可以是string类型,或者是一个指向C风格字符串的指针。构造函数都是explicit,默认的文件模式mode依赖于fstream类型。返回void。 fstrm.close(); //关闭与fstrm绑定的文件。返回void。 fstrm.is_open(); //返回一个bool值,表示与fstrm对象绑定的文件是否成功打开且尚未关闭。 ``` 当我们想要读写文件时,可以定义一个文件流对象,并将对象与文件关联起来。与 `ifstream` 关联的文件默认以 `in` 模式打开;与 `ofstream` 关联的文件默认以 `out` 模式打开。 | 文件模式 | 说明 | | -------- | ---------------------------- | | in | 以读的方式打开 | | out | 以写的方式打开 | | app | 每次写操作均定位到文件末尾 | | ate | 打开文件后立即定位到文件末尾 | | trunc | 截断文件 | | binary | 以二进制的方式进行IO |