7. 文件
对局录像就是“文件”;打开、读写、关闭就像操作录像。本节对应考纲 7。
这一章在学什么
程序里的数据可以存到文件里(比如存到硬盘上的一个 txt),下次运行再读出来。这一章考纲以了解为主:知道怎么用 fopen 打开、fclose 关闭、fprintf / fscanf 读写即可。
文件操作一般在本地环境(如 Dev-C++)才能完整运行,本页练习区只做简单演示;想练写文件可以在本机试。
本节考纲要点
- 了解 文件的定义及分类
- 了解 文件的打开及关闭
- 了解 文件的顺序读写
- 了解 文件的随机读写
本节代码里的英文词
fopen— 打开文件fclose— 关闭文件fp— 文件指针(常用来表示“当前打开的文件”)FILE— 文件类型NULL— 空(表示打开失败等)
文件的定义与分类
什么是文件
文件是存在磁盘等“外面”的数据,程序关掉后还在。就像对局录像存成文件,下次还能打开看。
文本文件与二进制文件
分类:文本文件(用记事本能打开,看到的是字符)和二进制文件(存的是二进制数据,如图片、程序生成的数据)。考纲以了解为主。
打开与关闭
fopen 与 fclose
用 fopen(文件名, 模式) 打开文件,用 fclose(fp) 关闭。打开后得到一个文件指针(常写成 FILE *fp),后面读、写都用这个 fp。
常用打开模式
常用打开模式:"r" 只读(文件要已存在);"w" 只写(没有就新建,有就清空);"a" 追加(在文件末尾接着写)。
打开可能失败(如文件不存在时用 "r"),所以一般先判断 fp != NULL 再读写,用完后一定要 fclose(fp)。
FILE *fp = fopen("replay.txt", "r"); /* 以只读方式打开 replay.txt */
if (fp != NULL) {
/* 这里用 fp 读或写 */
fclose(fp); /* 用完关闭 */
}
顺序读写(了解)
fprintf 与 fscanf
打开后从头往后按顺序读或写:fprintf(fp, ...) 像 printf 一样往文件里写内容;fscanf(fp, ...) 像 scanf 一样从文件里读。例如:fprintf(fp, "%d %d\n", hero_hp, gold); 把血量和金币写入文件;fscanf(fp, "%d", &x); 从文件读一个整数到 x。
随机读写(了解)
fseek 是什么
用 fseek 可以把“读写位置”移到文件中间某处,再读或写,叫随机访问。类比:录像拖到某一分钟再播。考纲为了解。
本章总示例(含 main)
本章讲的是文件操作(fopen、fclose、fprintf、fscanf 等),需在本机或在线环境运行。下面是一段完整可运行的 main 程序,在线运行只会输出提示;要练习写文件请在本机用 Dev-C++ 等打开并运行。
#include <stdio.h>
int main() {
printf("文件节:请在本地用 fopen 写文件\n");
return 0;
}
下面练习区已预填了这段代码,可修改后点击「运行」;若要在本机写文件,可仿照前文 fopen、fprintf 示例扩展。
练习区域
提示:注释可以暂时不写。本节以“了解”为主,文件操作需在本地或在线环境运行。下面给一个顺序结构小练习,你可以在本机尝试用 fopen、fprintf 写文件。
运行结果:
(点击「运行」后显示在这里)
易错知识(避免踩坑)
- fopen 后没检查 NULL:打开失败时 fp 为 NULL,不检查就用 fp 会出错,应先写
if (fp == NULL) return;。 - 用完文件没 fclose:打开后要记得
fclose(fp);,否则可能丢数据或占着资源。 - 模式写错:"r" 只读、"w" 会清空原文件、"a" 追加,用错会覆盖或读不到。
小结
- 文件:存在外存的数据;分文本文件和二进制文件。
- fopen 打开、fclose 关闭;模式 "r" 读 "w" 写 "a" 追加;打开后检查 fp 是否 NULL。
- 顺序读写:fprintf、fscanf 用法类似 printf、scanf,多一个 fp 参数。