🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一.基本概念 1. **流** 随着时间的推移,字符是顺序生成或消耗的。 2. **输入输出流** 由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象;流表示了信息从源到目的端的流动。由于流和内存缓冲区相对应,也可以说流就是缓冲区中的数据。 3. **程序的输入** 输入文件 -> 内存单元 4. **程序的输出** 内存单元 -> 输出文件 5. **C++输入输出的内容** + **标准输入输出(标准I/O)** 输入文件为键盘,输出文件为显示器屏幕 + **文件输入输出(文件I/O)** 输入文件为磁盘,输出文件为磁盘 + **字符串输入输出(串I/O)** 输入文件为内存,输出文件为内存。通常指定一个字符数组作为存储空间,但实际上可以存储任何类型的信息。 6. **低级I/O** 直接以字节为单位直接进行输入输出,在输入和输出时不进行格式转换。 + **优点** 速度快、效率高 + **缺点** 不直观 7. **高级I/O** 先将内存中的数据转换为ASCII字符,再按相应类型输出。通过提取运算符 `>>` 和插入运算符 `<<` 实现。 8. **文本文件** 每个字节放一个ascii代码,代表一个字符。 9. **二进制文件** 把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,就是二进制文件。 10. **缓冲区** 一个存储区域,用于保存数据。I/O设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。我们可以显式地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。 11. **打开文件** + 为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。 + 指定文件的工作方式,如:该文件是作为输入文件还是输出文件,是ASCII文件还是二进制文件等。 12. **关闭文件** 解除该磁盘文件与文件流的关联 13. **EOF** 文件末尾,是 `iostream` 头文件中定义的符号常量,代表 `-1`. ## 二.C++的I/O相对于C的优点 1. **类型安全** >C++的输入输出会对数据类型进行严格的检查。 >但在C语言中用prinf和scanf函数输入输出不同类型的数时,必须分别指定相应的格式符,十分麻烦,而且容易出错。 2. **可拓展性** >C++可以通过修改和拓充来实现自己声明的类型对象的输入输出。 >例如,C++可以通过重载插入<<运算符和提取运算符 \>\> 来实现任意类型的输出。 >但是C语言不能输出自己定义的结构体。 3. 缺点:复杂 ## 三.I/O设施 ### 1.I/O常用头文件 | 文件名 | 简介 | | ---- | ---- | | iostream |包含了对输人输出流进行操作所需的基本信息。| | fstream |用于用户管理的文件的I/O操作。| | strstream 或 sstream |用于字符串流I/O。| | iomanip |在使用格式化I/O时应包含此头文件。| ### 2.I/O常用类 | 类名 | 作用 | 头文件 | | ---- | ---- | ---- | | istream |通用输入流和其他输入流的基类|iostream| | ostream |通用输出流和其他输出流的基类|iostream| | iostream |通用输入输出流和其他输入输出流的基类|iostream| | ifstream |输入文件流类|fstream| | ofstream |输出文件流类|fstream| | fstream |输入输出文件流类|fstream| | istringstream |输入字符串流类|strstream 或 sstream| | ostringstream |输出字符串流类|strstream 或 sstream| | stringstream |输入输入字符串流类|strstream 或 sstream| ### 2.内置I/O对象 | 对象 | 含义 | 对应类 | 对应设备 | C语言相应输入输出文件 | | ---- | ---- | ---- | ---- | ---- | | cin |标准输入流|istream|键盘|stdin| | cout |标准输出流|ostream|屏幕|stdout| | cerr |标准错误流|ostream|屏幕|stderr| | clog |标准错误流|ostream|屏幕|stderr| ## 四.缓冲区的刷新 ### 1. 刷新输出缓冲区的条件 1. 程序正常结束,作为 `main` 函数的 `return` 操作的一部分,缓冲刷新被执行。 2. 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区。 3. 使用操纵符,如 `endl` ,来显式刷新缓冲区。 4. 在每个输出操作之后,用操纵符 `unitbuf` 设置流的内部状态,来清空缓冲区。默认情况下,对 `cerr` 是设置 `unitbuf` 的,因此写到 `cerr` 的内容都是立即刷新的。 5. 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,`cin` 和 `cerr` 都关联到 `cout` 。因此,读 `cin` 或写 `cerr` 都会导致 `cout` 的缓冲区被刷新。