C语言文件操作学习笔记
目录
- 文件基本概念
- 文件的打开与关闭
- 文件的顺序读写
- 文件的随机读写
- 常用文件操作函数
- 总结
文件基本概念
1. 什么是文件?
- 文件:存储在外部存储器(如硬盘)上的数据集合。
- 输入输出流:数据像流水一样从一处流向另一处,C语言将文件视为字符(字节)序列。
2. 文件分类
类型 | 特点 | 示例 |
---|
文本文件 | 以ASCII码形式存储,可读性强 | .txt , .c |
二进制文件 | 以二进制形式存储,节省空间 | .dat , .exe |
3. 文件指针
- FILE结构体:存储文件的详细信息(如文件名、状态、当前位置等)。
- 定义文件指针:
FILE *fp;
4. 文件缓冲区
- 缓冲文件系统:系统为每个文件开辟内存缓冲区,数据先写入缓冲区,满后再写入外存。
文件的打开与关闭
1. 打开文件:fopen()
FILE *fopen(const char *文件名, const char *打开模式);
文件打开模式
模式 | 说明 |
---|
"r" | 只读,文件不存在则失败 |
"w" | 只写,文件存在则清空,不存在则创建 |
"a" | 追加写,文件不存在则创建 |
"r+" | 读写,文件必须存在 |
"w+" | 读写,文件存在则清空,不存在则创建 |
"a+" | 读与追加写,不存在则创建 |
"b" | 二进制模式(需与其他模式组合,如"rb" , "wb" ) |
示例:安全打开文件
FILE *fp;
if ((fp = fopen("test.txt", "r")) == NULL) {
printf("无法打开文件!\n");
exit(0);
}
2. 关闭文件:fclose()
int fclose(FILE *fp);
文件的顺序读写
1. 字符读写函数
函数 | 功能 | 示例 |
---|
fputc(c, fp) | 写入一个字符到文件 | fputc('A', fp); |
fgetc(fp) | 从文件读取一个字符 | char c = fgetc(fp); |
示例:复制文件内容
#include <stdio.h>
int main() {
FILE *in = fopen("input.txt", "r");
FILE *out = fopen("output.txt", "w");
char c;
while ((c = fgetc(in)) != EOF) {
fputc(c, out);
}
fclose(in);
fclose(out);
return 0;
}
2. 字符串读写函数
函数 | 功能 | 示例 |
---|
fgets(s, n, fp) | 从文件读取字符串(最多读n-1字符) | fgets(buffer, 100, fp); |
fputs(s, fp) | 将字符串写入文件 | fputs("Hello World", fp); |
文件的随机读写
1. 文件指针定位函数
函数 | 功能 | 示例 |
---|
fseek(fp, offset, 起始位置) | 移动文件指针到指定位置 | fseek(fp, 100L, SEEK_SET); |
rewind(fp) | 将文件指针重置到文件开头 | rewind(fp); |
ftell(fp) | 返回当前指针位置(字节数) | long pos = ftell(fp); |
起始位置常量
SEEK_SET
(0):文件开头SEEK_CUR
(1):当前位置SEEK_END
(2):文件末尾
2. 示例:随机读取学生数据
#include <stdio.h>
struct Student {
char name[20];
int age;
};
int main() {
FILE *fp = fopen("students.dat", "rb");
struct Student s;
fseek(fp, 2 * sizeof(struct Student), SEEK_SET);
fread(&s, sizeof(struct Student), 1, fp);
printf("姓名:%s,年龄:%d\n", s.name, s.age);
fclose(fp);
return 0;
}
常用文件操作函数
1. 数据块读写函数
函数 | 功能 | 示例 |
---|
fread(buffer, size, count, fp) | 从文件读取数据块 | fread(&stu, sizeof(Student), 1, fp); |
fwrite(buffer, size, count, fp) | 向文件写入数据块 | fwrite(&stu, sizeof(Student), 1, fp); |
2. 文件结束判断:feof()
while (!feof(fp)) {
}
总结
关键知识点
- 文件操作步骤:打开 → 操作 → 关闭。
- 打开模式:
"r"
、"w"
、"a"
等需根据需求选择。 - 顺序读写:逐个字符或字符串处理。
- 随机读写:通过
fseek
定位指针,直接访问任意位置。 - 二进制文件:适合存储结构体等复杂数据。
注意事项
- 错误处理:始终检查文件是否成功打开。
- 缓冲区刷新:关闭文件前确保数据写入外存。
- 指针管理:避免越界操作导致数据损坏。
练习题:编写程序,从键盘输入5个学生的信息(姓名、年龄),保存到文件students.dat
中,并读取第3个学生的信息显示在屏幕上。