C++启蒙课程:第17章 输入、输出和文件
我们将学习数据“小水滴”如何在“管道”中流动,控制“缓冲区”,并使用“记忆卷轴”(文件)实现永久存储!
管道与缓冲区 (cout)
学习“数据水流”如何进入“暂存水桶”(缓冲区),以及 `endl` 如何“立即倾倒”。
智能水闸 (cin)
掌握“守卫机器人”`cin`如何检查输入,以及 `fail()` 状态灯和三步修复魔法。
记忆卷轴 (fstream)
学习“文件管理员” `ofstream` 和 `ifstream` 如何读写“永久记忆卷轴”。
课时一:管道与缓冲区:流模型与输出
(覆盖知识点 17.1 - 17.2.4)
17.1.1 “暂存水桶” (缓冲区)
数据(水滴)先进入“暂存水桶”(缓冲区)。水桶满或 `endl`(立即倾倒)时,才真正发送到屏幕。
17.2.4 格式化“展示位”
`width()` 机器人为下一个项目划定“展示位”宽度。`precision()` 则控制小数点后的位数。
课时二:智能水闸:输入与流状态
(覆盖知识点 17.2.2, 17.3)
17.3.2 “状态灯” (Stream States)
`cin` 有一个“状态灯”。输入正确时是 🟢 (good)。输入类型不匹配(如输入 "abc" 给 `int`)时,灯变 🟡 (fail)。
17.3.3 “三步修复魔法”
当状态灯变 🟡 (fail) 时,`cin` 会卡住。你必须用“三步魔法”来修复它:
cin.clear() (重置 🟡 -> 🟢)2.
cin.ignore() (启动吸尘器 🌪️)3. 提示重新输入...
课时三:记忆卷轴:文件I/O与模式
(覆盖知识点 17.4.1 - 17.4.5)
17.4.1 “永久记忆卷轴” (fstream)
`ofstream` (写入) 和 `ifstream` (读取) 是“文件管理员”,帮你读写“记忆卷轴”。必须用 `is_open()` 检查是否成功。
课时四:格式魔法与数据定位
(覆盖知识点 17.2.4, 17.5, 17.4.6)
17.2.4 “格式魔法开关” (setf)
`setf()` 机器人帮你按下“格式开关”。例如 `ios_base::fixed` 强制使用定点表示法(非科学计数法)。
123.4567817.4.6 “数据定位GPS” (seek)
`seekg()` 就像GPS,允许你“瞬移”到文件的任意位置开始读取,而不是从头开始。
编程实践与作业
是时候检验你作为“I/O流控制大师”的实力了!
练习 1:格式化输出 (17.2.4)
任务:
使用 width() 和 precision() 方法打印一个浮点数,要求总宽度为12,小数点后保留5位。
点击查看参考答案
练习 2:流状态恢复 (17.3)
任务:
编写一个程序,要求用户输入一个整数。如果输入失败(用户输入了字母),程序必须捕获 fail 状态,使用“三步修复魔法”(clear(), ignore(), 重新提示)来恢复输入流。
点击查看参考答案
练习 3:文件追加 (17.4.5)
任务:
编写一个程序,要求用户输入一行文本,并将该文本写入到 "diary.txt" 中(使用 ios::app 追加模式)。
点击查看参考答案
练习 4:格式魔法 (17.2.4)
任务:
使用 setf() 和 precision() 强制以定点格式显示 double 值,并保留小数点后 3 位。
点击查看参考答案
本章知识点总结与复习
| 核心概念 | 解释/功能 | 关键用法/示例 |
|---|---|---|
| 流 (Stream) | 程序和I/O设备之间的数据传输抽象。 | istream, ostream |
| 缓冲区 (Buffer) | 临时存储区域,提高I/O效率。 | endl (刷新缓冲区) |
| 流状态 | 描述流操作是否成功的标志 (Good, EOF, Fail, Bad)。 | cin.fail() |
| 状态恢复 | 三步魔法:`clear()` (重置), `ignore()` (清理)。 | cin.clear(); cin.ignore(); |
| 文件I/O | 通过 `ifstream` (读) 和 `ofstream` (写) 交互。 | #include <fstream> |
| 文件模式 | 控制文件打开方式,如 `ios::app` (追加)。 | fout.open(..., ios::app); |
| 格式化 | 使用 `width()`, `precision()`, `setf()` 控制输出外观。 | cout.setf(ios_base::fixed); |
| 随机存取 | 直接跳转到文件中任何位置进行读写。 | fin.seekg(), fout.seekp() |