💾 编程课题 8.3:文件处理 —— 永久保存你的劳动成果!
欢迎来到“文件处理”章节! 到目前为止,当你的程序运行时,你输入的任何数据(如分数、姓名或计算结果)通常都存储在内存(RAM,随机存取存储器)的变量中。
问题在于:一旦程序结束,这些数据就会永久消失!这对于像高分榜、通讯录或用户账户系统这样的应用程序来说显然是不够的。
文件处理是一个至关重要的过程,它让你的程序能够将数据永久保存到二级存储设备(如硬盘或固态硬盘)中。这意味着数据可以被持久保存,并在程序下次运行时再次使用。
1. 文件处理的目的 (8.3.1)
使用文件的核心思想是实现持久化(Persistence)。持久化简单来说,就是即使在程序停止运行、计算机关机后,数据依然被保存着。
类比:计算机的文件柜
你可以把你的程序想象成办公室里的临时工。变量就像便利贴——用起来很方便,但办公室下班时就会被清理掉。
而文件就像存放在安全地点的文件柜。为了保存或检索重要信息,程序必须遵循特定的流程:
- 拿钥匙(打开文件 - OPEN)。
- 存入或取出信息(写入或读取文件 - WRITE 或 READ)。
- 锁上柜子(关闭文件 - CLOSE)。
核心要点: 文件为程序使用的数据提供了永久存储,使信息能够跨越应用程序的多次运行而长期存在。
2. 三个基本文件操作 (8.3.2)
为了安全且成功地与文件交互,程序必须按顺序执行这三个步骤:
- OPEN(打开文件): 此操作在程序和存储设备上的物理文件之间建立连接。它同时告诉计算机你打算使用什么模式(读取或写入)。
- PROCESS(处理数据): 这涉及反复将数据从文件读取到变量中,或者将数据从变量写入到文件中。
- CLOSE(关闭文件): 这非常关键!关闭文件可以终结连接,确保所有已保存的数据被正确写入磁盘,并释放文件,以便其他程序能够使用它。
🚫 常见错误: 忘记执行 CLOSEFILE 可能会导致数据损坏,或者因为数据未完全从临时缓冲区写入永久存储器而造成数据丢失。
3. 文件模式:READ(读取) vs. WRITE(写入)
当你 OPEN 一个文件时,必须指定你想要进行的操作。根据考纲要求,你不能在同一个命令中同时进行读写。
模式 1:FOR READ(读取模式)
目的: 当你想要从文件中检索或加载现有的数据到程序中时使用。
动作: 程序从文件的开头开始,逐项或逐行地读取数据。
如果一开始觉得难,别担心! 只需记住,当你 READ 时,你就像一个“提取器”——你正在把信息拉出来。
模式 2:FOR WRITE(写入模式)
目的: 当你想要将程序变量中的新数据保存或存储到文件中时使用。
动作: 这是一种“霸道”模式!
- 如果文件已经存在,其内容会被完全删除(覆盖)。
- 创建一个新的空文件,程序开始向其中写入数据。
🚨 记忆小窍门:WRITE 意味着 WIPE(擦除旧数据)。
4. 伪代码命令 (8.3.2)
我们在伪代码中使用特定的命令来执行这些操作:
1. OPENFILE 命令
此命令启动文件处理流程并设置模式。
语法: OPENFILE <File Identifier> FOR <File mode>
示例 1(读取):
OPENFILE "HighScores.txt" FOR READ
示例 2(写入/覆盖):
OPENFILE "LogData.txt" FOR WRITE
2. READFILE 命令
此命令将数据从文件移动到变量中。文件必须先以 FOR READ 模式打开。
语法: READFILE <File Identifier>, <Variable>
示例:
READFILE "Names.txt", UserName
// "Names.txt" 中的下一项可用数据被放入变量 UserName 中。
3. WRITEFILE 命令
此命令将数据从变量移动到文件中。文件必须先以 FOR WRITE 模式打开。
语法: WRITEFILE <File Identifier>, <Variable>
示例:
WRITEFILE "LogData.txt", ErrorMessage
// 变量 ErrorMessage 的内容被写入到 "LogData.txt" 文件中。
4. CLOSEFILE 命令
此命令释放文件并永久保存更改。
语法: CLOSEFILE <File Identifier>
示例:
CLOSEFILE "HighScores.txt"
5. 读取和写入数据项 (8.3.2 指导)
考纲要求你处理两种类型的数据单元:
A. 读取/写入单个数据项
当你存储单条信息(如数字或特定名称)时,你需要多次使用 READFILE 或 WRITEFILE。如果你在读取数据项,必须清楚它们的顺序。
写入两个整数的示例:
DECLARE Score1 : INTEGER
DECLARE Score2 : INTEGER
Score1 ← 88
Score2 ← 91
OPENFILE "Scores.dat" FOR WRITE
WRITEFILE "Scores.dat", Score1
WRITEFILE "Scores.dat", Score2
CLOSEFILE "Scores.dat"
B. 读取/写入文本行
“文本行”通常是一条完整的记录(一个很长的 STRING),其中可能包含用逗号分隔的多个数据字段(就像 CSV 文件一样)。
当你读取文本行时,整行字符串(直到下一个换行符为止)会一次性被提取出来。
读取文本行的示例:
DECLARE StudentRecord : STRING
OPENFILE "StudentInfo.csv" FOR READ
READFILE "StudentInfo.csv", StudentRecord
// 如果文件包含 "John Doe, 15, Class A",整个字符串将存储在 StudentRecord 中。
CLOSEFILE "StudentInfo.csv"
💡 核心提示:遍历文件
由于文件通常包含许多行或数据项,你几乎总是需要使用迭代(如 WHILE 或 REPEAT UNTIL 循环)来按顺序读取所有数据。例如,你可以将前测循环(WHILE)与库函数(如 EOF - End of File,即文件结束符)结合使用,不断读取直到到达文件末尾,从而确保抓取到每一条记录。
快速回顾:文件处理要素
- Purpose(目的):Persistence(持久化,永久保存数据)。
- Operations(操作):Open(打开)、Process(处理/读写)、Close(关闭)。
- Read Mode(读取模式):把数据从文件中“拉”出来。
- Write Mode(写入模式):把数据“推”进文件,并会 Wipe(擦除)原有内容。