定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
所有学生数据均以二进制方式输出到student.dat文件中。
函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据不变;若找不到,则什么都不做。
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, long sno)
{
FILE *fp;
STU n;
int i;
fp = fopen(filename, "rb+");
while (!feof(fp)) // 用来判断文件内部指针是否指向了文件末尾
{
fread(&n, sizeof(STU), 1, fp);
if (n.sno == sno)
break;
}
if (!feof(fp)) // 用来判断文件内部指针是否指向了文件末尾
{
for (i = 0; i < 3; i++)
n.score[i] += 3;
fseek(fp, -(long)sizeof(STU), SEEK_CUR); // 将位置指针移动到任意位置。 SEEK_CUR(当前位置)
fwrite(&n, sizeof(STU), 1, fp);
}
fclose(fp);
}
int main()
{
STU t[N] = {
{10001, "MaChao", 91, 92, 77},
{10002, "CaoKai", 75, 60, 88},
{10003, "LiSi", 85, 70, 78},
{10004, "FangFang", 90, 82, 87},
{10005, "ZhangSan", 95, 80, 88}
}, ss[N];
int i, j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j = 0; j < N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ", ss[j].sno, ss[j].name);
for (i = 0; i < 3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", 10003);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe data after modifing :\n");
for (j = 0; j < N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ", ss[j].sno, ss[j].name);
for (i = 0; i < 3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
}
程序结果: