大家好,我是网域小星球。
前面我们写的程序,数据都是存在内存里的,程序一关数据就没了。想要让数据永久保存 ,比如把学生成绩、个人信息存到文件里,下次打开还能读取,就必须用到文件操作。
本篇从文件基础、打开关闭、读写方式到综合实战完整讲解,全程 VS2022 可直接运行,零基础也能轻松学会。
目录
[1. 什么是文件?](#1. 什么是文件?)
[2. 文件操作核心步骤](#2. 文件操作核心步骤)
[3. 文件指针](#3. 文件指针)
[1. 打开文件 fopen](#1. 打开文件 fopen)
[2. 关闭文件 fclose](#2. 关闭文件 fclose)
[3. 判断文件是否打开成功](#3. 判断文件是否打开成功)
[1. 格式化写入 fprintf](#1. 格式化写入 fprintf)
[2. 格式化读取 fscanf](#2. 格式化读取 fscanf)
一、本章学习目标
学完本篇你将彻底掌握:
- 文件的基本概念与文件路径
- 文件操作的标准流程:打开 → 读写 → 关闭
- 文件打开模式:r、w、a、r+、w+、a+
- 字符读写、字符串读写、格式化读写
- 文件判断与错误处理
- 综合实战:把学生信息保存到文件并读取
二、文件操作基础
1. 什么是文件?
存放在硬盘上的数据集合,比如:
- 文本文件:
.txt.c.h - 二进制文件:
.exe.jpg.doc
入门阶段我们只学文本文件。
2. 文件操作核心步骤
- 打开文件
fopen - 读写文件
fscanf / fprintf / fgets / fputs - 关闭文件
fclose
3. 文件指针
C 语言用 FILE* 代表一个文件:
cpp
FILE *fp;
三、文件打开与关闭
1. 打开文件 fopen
cpp
FILE *fp = fopen("文件路径", "打开模式");
常用模式:
r:只读(文件必须存在)w:只写(文件不存在则创建,存在则清空)a:追加(文件不存在则创建,存在则在末尾添加)r+:可读可写w+:可读可写(清空原有内容)a+:可读可写(追加)
2. 关闭文件 fclose
cpp
fclose(fp);
一定要关闭,否则可能数据丢失。
3. 判断文件是否打开成功
cpp
if (fp == NULL) {
printf("打开失败!");
return 0;
}
四、文件常用读写函数
1. 格式化写入 fprintf
类似 printf,只是写入文件:
cpp
fprintf(fp, "学号:%d 姓名:%s 成绩:%.1f\n", id, name, score);
2. 格式化读取 fscanf
类似 scanf,从文件读:
cpp
fscanf(fp, "%d%s%f", &id, name, &score);
- 字符串写入 fputs
cpp
fputs("hello world", fp);
- 字符串读取 fgets
cpp
char buf[100];
fgets(buf, 100, fp);
- 判断文件结束 feof
cpp
while (!feof(fp)) { ... }
五、基础示例:写入文件
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
FILE *fp = fopen("test.txt", "w");
if (fp == NULL)
{
printf("文件打开失败\n");
return 0;
}
fprintf(fp, "姓名:小明\n");
fprintf(fp, "年龄:18\n");
fprintf(fp, "成绩:95.5\n");
fclose(fp);
printf("写入成功\n");
return 0;
}
运行后项目目录会出现 test.txt。
六、基础示例:读取文件
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
FILE *fp = fopen("test.txt", "r");
if (fp == NULL)
{
printf("文件不存在\n");
return 0;
}
char buf[100];
while (fgets(buf, 100, fp) != NULL)
{
printf("%s", buf);
}
fclose(fp);
return 0;
}
七、综合实战:学生信息保存到文件
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct Student
{
int id;
char name[20];
float score;
};
int main()
{
struct Student stus[2] = {
{1001, "zhangsan", 90.5},
{1002, "lisi", 88.0}
};
// 写入文件
FILE *fp = fopen("student.txt", "w");
if (fp == NULL) return 0;
for (int i = 0; i < 2; i++)
{
fprintf(fp, "%d %s %.1f\n", stus[i].id, stus[i].name, stus[i].score);
}
fclose(fp);
printf("写入成功\n");
// 读取文件
fp = fopen("student.txt", "r");
printf("\n读取结果:\n");
int id;
char name[20];
float score;
while (fscanf(fp, "%d%s%f", &id, name, &score) != EOF)
{
printf("%d %s %.1f\n", id, name, score);
}
fclose(fp);
return 0;
}
八、高频易错点
- 文件打开后忘记关闭
fclose - 用
r模式打开不存在的文件 - 用
w模式误清空原有数据 - 文件路径写错导致打开失败
- 读取格式与写入格式不匹配
- 循环读取时未判断
EOF导致死循环
九、本章核心总结
- 文件操作流程:打开 → 读写 → 关闭
FILE*是文件标识- 常用模式:
r读、w写、a追加 - 格式化读写:
fprintf/fscanf - 字符串读写:
fputs/fgets - 文件操作让数据实现持久化保存
下期预告
下一篇是用前面所有知识做一个完整小项目:增、删、查、看、保存到文件,实现真正可运行的系统。