12.4 文件的定位
“文件位置指针”和“文件指针”是两个完全不同的概念。文件指针是在程序中定义的FILE类型的变量,通过fopen()函数,把文件指针和某个文件建立联系。C语言程序通过文件指针实现对文件的各种操作。文件位置指针只是一个形象化的概念,下面将用文件位置指针来表示当前读或写的数据在文件中的位置。当打开文件时,可以认为文件位置指针总是指向文件的开头,即第一个数据之前。当文件位置指针指向文件末尾时,表示文件结束。
考点7 fseek()函数和随机读写
真考链接
考点7 偏难,属于重点理解内容,在操作题中以填空题的形式出现,考核概率为5%。
如果控制好文件的位置指针,就可以对流式文件进行顺序读写和随机读写。fseek()函数的功能就是移动文件位置指针到指定的位置,其一般的调用形式为:
fseek(文件类型指针,位移量,起始点)
其中起始点的标识符和对应数字见表12.1。
表12.1 位移量的表示方法及含义
“位移量”指以“起始点”为基点,向前移动的字节数。C语言要求位移量是long型数据,并规定在数字的末尾加一个字母L。
常见问题
“文件位置指针”和“文件指针”这两个概念有何区别?
文件指针是在程序中定义的FILE类型的变量,通过fopen()函数,把文件指针和某个文件建立联系。文件位置指针只是一个形象化的概念,用文件位置指针来表示当前读或写的数据在文件中的位置。当打开文件时,可以认为文件位置指针总是指向文件的开头。当文件位置指针指向文件末尾时,表示文件结束。
真题精选
程序通过定义学生结构体变量,存储学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student. dat文件中。函数fun()的功能是:从文件中找出指定学号的学生数据,读入此学生数据,对该学生的分数进行修改,使每门课的分数加3分,修改后重写文件中学生的数据,即用该学生的新数据覆盖源数据,其他学生数据指定不变;若找不到,则不做任何操作。
请在标号处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdio.h>
#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(【1】))
{ fread(&n,sizeof(STU),1,fp);
if(n.sno【2】sno)break;
}
if(!feof(fp))
{ for(i=0;i<3;i++)n.score[i] += 3;
fseek(【3】,-(long)sizeof(STU), SEEK CUR);
fwrite(&n,sizeof(STU),1,fp);
}
fclose(fp);
}
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:% 8sScores:",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:%
8sScores:",ss[j].sno,ss[j].name);
for(i=0;i<3;i++)printf("% 6. 2f ",ss[j].score[i]);
printf("\n");
}
}
【答案】【1】fp 【2】 == 【3】 fp
【解析】本题考查:文件结束检测函数feof;if语句条件表达式;fseek函数。
标号【1】:while循环语句的循环条件是判断文件是否结束,配合feof函数来完成,其一般形式为:feof(文件指针)。
标号【2】:根据题目要求确定if语句条件表达式的内容,满足条件后跳出循环。
标号【3】:文件定位函数fseek,调用形式为fseek(文件指针,位移量,起始点),此处文件指针是fp。