一、首先我们来复习一下C语言文件相关的必会知识点:
1. 文件的打开与关闭:C语言使用`fopen()`函数来打开文件,需要指定文件名和打开模式(如读取、写入等)。打开文件成功后,可以使用`fclose()`函数来关闭文件。
2. 文件的读写操作:C语言提供了多种函数用于对文件进行读写操作。常用的函数包括:
- `fscanf()`和`fprintf()`:用于按格式从文件中读取数据和向文件中写入数据。
- `fgetc()`和`fputc()`:用于逐个字符地从文件中读取数据和向文件中写入数据。
- `fgets()`和`fputs()`:用于逐行地从文件中读取数据和向文件中写入数据。
3. 文件位置指示器:每个打开的文件都有一个位置指示器,用于记录当前读写位置。使用`ftell()`函数可以获取当前位置指示器的位置,使用`fseek()`函数可以改变位置指示器的位置。
4. 错误处理:在文件操作中,可能出现一些错误,如文件打开失败、读写错误等。通过检查文件指针返回值或使用`feof()`和`ferror()`函数可以判断是否出现错误,并进行相应的处理。
5. 文件的读写模式:在打开文件时,需要指定文件的读写模式。常用的模式包括:
- "r":只读模式,文件必须存在。
- "w":写入模式,如果文件不存在,则创建新文件;如果文件已存在,则清空文件内容。
- "a":追加模式,如果文件不存在,则创建新文件;如果文件已存在,则在文件末尾追加内容。
6. 二进制文件操作:除了文本文件外,C语言还支持对二进制文件进行读写操作。对于二进制文件的读写,常用的函数包括:
- `fread()`和`fwrite()`:用于以二进制方式读取和写入数据。
熟练掌握以上C语言文件相关的一些必会知识点,将使你能够灵活处理文件操作的需求。
二、接下来让我们用具体的一个示例程序,演示如何将20位同学的信息写入名为 "student.dat" 的文件,并从文件中读取学号在 minnum~maxnum 之间的学生信息并显示出来。
#include <stdio.h>
#include <stdlib.h>
// 学生的信息结构体
typedef struct {
long num; // 学号
char name[10]; // 姓名
int age; // 年龄
char sex; // 性别
char speciality[20]; // 专业
char address[40]; // 住址
} Student;
// 将所有学生信息写入文件student.dat
void WriteToFile(Student students[], int n) {
// 打开名为 "student.dat" 的文件,以二进制写入的方式
FILE *file = fopen("student.dat", "wb");
if (file == NULL) {
printf("无法打开文件!");
return;
}
// 将学生信息写入文件
fwrite(students, sizeof(Student), n, file);
// 关闭文件
fclose(file);
}
// 从文件student.dat中读取学号在minnum~maxnum之间的学生信息并显示在屏幕上
void ReadFromFile(long minnum, long maxnum) {
// 打开名为 "student.dat" 的文件,以二进制读取的方式
FILE *file = fopen("student.dat", "rb");
if (file == NULL) {
printf("无法打开文件!");
return;
}
// 读取学生信息,并显示学号在minnum~maxnum之间的学生信息
Student student;
while (fread(&student, sizeof(Student), 1, file)) {
if (student.num >= minnum && student.num <= maxnum) {
printf("学号:%ld,姓名:%s,年龄:%d,性别:%c,专业:%s,住址:%s\n",
student.num, student.name, student.age, student.sex, student.speciality, student.address);
}
}
// 关闭文件
fclose(file);
}
int main() {
Student students[20];
// 从键盘输入学生信息
for (int i = 0; i < 20; i++) {
printf("请输入第%d位同学的学号、姓名、年龄、性别、专业和住址(以空格分隔):", i + 1);
scanf("%ld %s %d %c %s %[^\n]", &(students[i].num), students[i].name, &(students[i].age),
&(students[i].sex), students[i].speciality, students[i].address);
}
// 将所有学生信息写入文件
WriteToFile(students, 20);
// 输入要查询的学号范围
long minnum, maxnum;
printf("请输入要查询的学号范围:");
scanf("%ld %ld", &minnum, &maxnum);
// 从文件中读取学生信息,并显示学号在minnum~maxnum之间的学生信息
ReadFromFile(minnum, maxnum);
return 0;
}
请确保在编译和运行上述程序之前,已经正确初始化了 `students` 数组中的学生信息。该程序通过使用结构体 `Student` 存储一个学生的信息,并使用二进制模式的文件 I/O 操作来写入和读取学生信息。