59
项项 10 项项项项项项项项项项项

项目 10 学生成绩单的保存与读取

  • Upload
    brick

  • View
    110

  • Download
    0

Embed Size (px)

DESCRIPTION

项目 10 学生成绩单的保存与读取. 项目 10 学生成绩单的保存与读取. 【 学习目标 】. (1) 掌握 C 语言中文件的相关概念。 (2) 掌握文件有关操作常用标准库函数的使用。 (3) 掌握对文件的简单输入 / 输出操作。. 任务 10.1 将多个学生成绩单顺序读写到文件中. 任务介绍. 考试结束后,得到了全班学生多门课程的成绩。要求将一小组 3 个学生成绩信息写入到文件存档保存。学生成绩信息是个结构体,包括学生姓名、性别与学生成绩 3 个成员变量。 学生成绩信息如下: 肖飞 男 86 56 76 李雪 女 75 95 83 - PowerPoint PPT Presentation

Citation preview

Page 1: 项目 10   学生成绩单的保存与读取

项目 10 学生成绩单的保存与读取

Page 2: 项目 10   学生成绩单的保存与读取

项目 10 学生成绩单的保存与读取【学习目

标】(1) 掌握 C 语言中文件的相关概念。(2) 掌握文件有关操作常用标准库函数的使用。(3) 掌握对文件的简单输入 / 输出操作。

Page 3: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务介绍任务介绍考试结束后,得到了全班学生多门课程的成绩。要求将一小组3 个学生成绩信息写入到文件存档保存。学生成绩信息是个结构体,包括学生姓名、性别与学生成绩 3 个成员变量。学生成绩信息如下:肖飞 男 86 56 76李雪 女 75 95 83郭键 男 91 89 61要求输出格式为:学生成绩信息为: 肖飞 男 86 56 76 李雪 女 75 95 83 郭键 男 91 89 61

Page 4: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

解决思路方法:S1:初始化学生成绩信息到结构体数组。S2:将结构体数组顺序写入到文件 stuinfo.dat中。S3:从 stuinfo.dat中顺序读出学生信息,并输出。

Page 5: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#define SIZE 3struct student{ char name[20]; char sex [3]; float score[SIZE];};struct student stu[SIZE]={{"肖飞 "," 男 ",86,56,76},{"李雪 "," 女 ",75,95,83},{"郭键 "," 男 ",91,89,61}};void Save(struct student *pStu,char *fileName);

Page 6: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:void Read(char * fileName);void Output(struct student *pStu);void main(){ char * fileName="stuInfo.dat"; Save(stu,fileName); Read(fileName);}void Output(struct student * pStu){ int i,j;

Page 7: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: for(i=0;i<SIZE;i++) { printf("%s\t%s\t",pStu->name,pStu->score); for( j=0;j<SIZE;j++) { printf("%3.0f\t",pStu->score[j]); } pStu++; printf("\n"); }}void Save(struct student *pStu,char *fileName)

Page 8: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:{ FILE *fp; int i; if((fp=fopen(filename,"w"))==NULL) { printf("不能打开文件 \n"); return; } for( i=0;i<SIZE;i++) { if(fwrite(pStu+i,sizeof(struct student),1,fp)!=1) {

Page 9: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: printf("文件写入错误 \n"); break; } } fclose(fp);}void Read(char *fileName){ FILE *fp; int i; struct student stud[3];

Page 10: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: if((fp=fopen(filename,"r"))==NULL) { printf("不能打开文件 \n"); return; } for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student),1,fp); } fclose(fp); Output(stud);}

Page 11: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.1 文件的基本概念所谓“文件”,一般指存储在外部介质上数据的集合。

(1)  ASCII文件。

(2) 二进制文件。

Page 12: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.1 文件的基本概念

Page 13: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.1 文件类型指针10.1.2.1 文件类型指针定义一个文件类型的指针变量:

(1) 语法。FILE *指针变量名

例如:

FILE *fp;

Page 14: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.1 文件类型指针10.1.2.1 文件类型指针定义一个文件类型的指针变量:

(2) 语义。fp是一个指向 FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。通常,每个不同文件都应设不同的指针变量。

“ ”在对文件读写之前应该 打开 该文件,在文件使用介绍后应关闭该文件。

Page 15: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.2 文件的打开10.1.2.2 文件的打开ANSI C规定了标准输入输出函数库,用 fopen()函数来实现打开文件。

(1) 语法。fp=fopen(文件名 ,使用文件方式 )

例如:

FILE * fp;fp=fopen("abc.txt","w");

Page 16: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.2 文件的打开10.1.2.2 文件的打开ANSI C规定了标准输入输出函数库,用 fopen()函数来实现打开文件。

(2) 语义。“表示要打开的名字为 abc.txt” “的文件,使用方式为 写

”入 。 fopen “函数返回一个指向 abc.txt”文件的指针并赋给文件结构体指针 fp,这样 fp “就指向了 abc.txt”文件。在打开一个文件时,需要以下 3个信息:1) 需要打开的文件名,也就是准备访问的文件名字。2) 使用文件的方式 (“ ” “ ”读 或 写 等 )。3) 让哪个指针变量指向被打开的文件。

Page 17: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.2 文件的打开10.1.2.2 文件的打开

表 10-1 使用文件的方式文件使用方式 含义

“r”( 只读 ) 为输入打开一个文本文件“w”( 只写 ) 为输出打开一个文本文件“a”( 追加 ) 向文本文件尾增加数据“rb”( 只读 ) 为输入打开一个二进制文件“wb”( 只写 ) 为输出打开一个二进制文件“ab”( 追加 ) 向二进制文件尾增加数据“r+”( 读写 ) 为读 / 写打开一个文本文件“w+”( 读写 ) 为读 / 写建立一个新的文本文件“a+”( 读写 ) 为读 / 写打开一个文本文件“rb+”( 读写 ) 为读 / 写打开一个二进制文件“wb+”( 读写 ) 为读 / 写建立一个新的二进制文件“ab+”( 读写 ) 为读 / 写打开一个二进制文件

Page 18: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.3 文件的关闭10.1.2.3 文件的关闭用 fclose函数关闭文件。

(1) 语法。fclose(文件指针 );

例如:

fclose(文件指针 );

Page 19: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.2 文件的打开与关闭10.1.2.3 文件的关闭10.1.2.3 文件的关闭用 fclose函数关闭文件。

(2) 语义。在前面打开文件时,把打开文件所带回的指针赋值给了 fp,通过 fp把该文件关闭,即 fp不再指向该文件。应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件,将会丢失数据。因为如前所述,在向文件写数据时,是先将数据输到缓冲区,待缓冲区充满后才正式输出给文件。如果当数据未充满缓冲区而程序结束运行,就会将缓冲区中的数据丢失。用 fclose函数关闭文件,可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。fclose函数也返回一个值,如果返回值为 0,则表示顺利执行了文件的关闭操作;否则返回 EOF(-1)。

Page 20: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.1 fputc 函数10.1.3.1 fputc 函数

(1) 语法。

fputc(字符常量 /字符变量 ,文件指针 );

例如:

fputc(字符常量 /字符变量 ,文件指针 );

Page 21: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.1 fputc 函数10.1.3.1 fputc 函数

(2) 语义。

将字符 (ch的值 )输出到 fp所指向的文件中。 fputc

函数也返回一个值:如果输出成功,则返回值就是输

出的字符;如果输出失败,则返回一个 EOF(-

1) 。 EOF是在 stdio.h文件中定义的符号常量,值

为 -1。

Page 22: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.2 fgetc 函数10.1.3.2 fgetc 函数

(1) 语法。

字符变量 =fgetc(fp)

例如:

ch=fgetc(fp);

Page 23: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.2 fgetc 函数10.1.3.2 fgetc 函数

(2) 语义。

从 fp所指向的文件中读取一个字符并赋给字符变量

ch。如果在执行 fgetc读字符时遇到文件结束符,函

数返回一个文件结束标志 EOF(-1)。

Page 24: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);

一个指针

要读写的字节数

要进行读写多少个 size字节的数据项

Page 25: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数【例 10-2】从键盘上输入 3个学生的信息,保存到文

“件 stu.dat”中,然后从文件中读取,并输出。【例 10-2】从键盘上输入 3个学生的信息,保存到文

“件 stu.dat”中,然后从文件中读取,并输出。

程序如下:#define SIZE 3struct student{ char name[10]; char sex [3]; int age; char address[20];

Page 26: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

};struct student stu[SIZE];void Save(char *fileName);void Read(char *fileName);void Output(struct student *pStu); void main(){ char *fileName="stu.dat"; int I;

Page 27: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

printf("请输入三个学生的数据:姓名、性别、年龄与地址,数据用空格分隔 \n"); for( i=0;i<SIZE;i++) { scanf("%s%s%d%s",&stu[i].name,&stu[i].sex,&stu[i].age,&stu[i].address); } Save(fileName); printf("学生数据已经保存 \n"); printf("从文件中读出的学生数据为: \n");

Page 28: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

Read(fileName);}void Output(struct student *pStu){ int i; for(i=0;i<SIZE;i++) { printf("%s\t%s\t%d\t%s\n",pStu->name,pStu->sex,pStu->age,pStu->address); pStu++; }

Page 29: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

}void Save(char *fileName){ FILE *fp; int i; if((fp=fopen(filename,"w"))==NULL) { printf("不能打开文件 \n"); return; } for(i=0;i<SIZE;i++)

Page 30: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

{ if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) { printf("文件写入错误 \n"); break; } } fclose(fp);} void Read(char *fileName){

Page 31: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

FILE *fp; int i; if((fp=fopen(filename,"r"))==NULL) { printf("不能打开文件 \n"); return; } struct student stud[3]; for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student),1,fp);

Page 32: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.3 fread函数与 fwrite函数10.1.3.3 fread函数与 fwrite函数

} fclose(fp); Output(stud);}

Page 33: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.4 fprintf函数与 fscanf函数10.1.3.4 fprintf函数与 fscanf函数

Page 34: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.4 fprintf函数与 fscanf函数10.1.3.4 fprintf函数与 fscanf函数

例如:fprintf(fp,"%d,%4.2f",i,j);

它的作用是将整型变量 i 和实型变量 j 的值按 %d和 %4.2f 的格式输出到 fp 指向的文件上。

fscanf(fp,“%d,%f”,&i,&j);

它的作用是将文件中一个整型数据和一个实型数据读出,整型数据给变量 i,实型数据给变量 j。

Page 35: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.4 fprintf函数与 fscanf函数10.1.3.4 fprintf函数与 fscanf函数

【例 10-3 】格式化保存数据到文件中,并读出显示到屏幕上。【例 10-3 】格式化保存数据到文件中,并读出显示到屏幕上。程序如下:void main(){ char *fileName="file2.txt"; FILE *fp1 , *fp2; int i; float j; if((fp1=fopen(filename,"w"))==NULL) { printf("打开文件错误 \n");

Page 36: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.4 fprintf函数与 fscanf函数10.1.3.4 fprintf函数与 fscanf函数

exit(0); } printf("请输入一个整型数据与一个实型数据,数据之间用逗号隔开 \n"); scanf("%d,%f",&i,&j); fprintf(fp1,"%d,%6.2f",i,j); fclose(fp1); printf("输入的数据已保存到文件 file2.txt 中 \n"); printf("文件 file2.txt中的内容为: \n"); if((fp2=fopen(filename,"r"))==NULL) {

Page 37: 项目 10   学生成绩单的保存与读取

任务 10.1 将多个学生成绩单顺序读写到文件中

10.1.3 文件的顺序写入与读取10.1.3.4 fprintf函数与 fscanf函数10.1.3.4 fprintf函数与 fscanf函数

printf("打开文件错误 \n"); exit(0); } int i2; float j2; fscanf(fp2,"%d,%f",&i2,&j2); fclose(fp2); printf("%d,%6.2f\n",i2,j2);}

Page 38: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务介绍任务介绍任务 10.1 已经把学生的成绩信息保存到了文件“ stuinfo.dat”中。现要求把学生李雪的第二门成绩由 95 更改为 85 ,并保存。学生成绩信息如下:肖飞 男 86 56 76李雪 女 75 95 83郭键 男 91 89 61要求输出格式为:学生成绩信息为:肖飞 男 86 56 76李雪 女 75 95 83郭键 男 91 89 61更新后的学生成绩信息为:肖飞 男 86 56 76李雪 女 75 85 83郭键 男 91 89 61

Page 39: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

解决思路解决思路方法 1:S1:从文件中读出所有学生成绩信息到结构体数组中。S2:把结构体数组中李雪的第二门课程的成绩由 95改为 85。S3:把结构体数组重新全部写入到文件中。通过方法 1的描述,可以发现此方法存在效率低下的问题。假如文件中保存有几十条,上百条甚至几千条学生成绩记录的话,为了修改其中一条记录,而不得不对全部的记录进行读写,将会对程序的执行效率有很大的影响。

Page 40: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

解决思路解决思路由上述的分析可知,采用方式 1实现本任务是不科学的。现介

“ ”绍一种新的方法,只需对文件中 李雪 这条的记录进行读写操作,而不会涉及其他无关的记录。方法 2:S1:从文件中读出学生李雪一条成绩信息到结构体中。S2:把结构体中李雪的第二门课程的成绩由 95改为 85。S3:把结构体重新写入到文件中。

Page 41: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#define SIZE 3struct student{ char name[20]; char sex [3]; float score[SIZE];};void Read(char *fileName);void Output(struct student *pStu);void RandomRead(char *filename,int i); /*随机读函数 */void RandomWrite(char *filename,struct student stud,int i);

Page 42: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:void main(){ char *fileName="stuInfo.dat"; printf("学生成绩信息为: \n"); Read(fileName); RandomRead(filename,1); printf("更新后的学生成绩信息为: \n"); Read(fileName);}void Output(struct student *pStu){ int I;

Page 43: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: for(i=0;i<SIZE;i++) { printf("%s\t%s\t",pStu->name,pStu->sex); for(int j=0;j<SIZE;j++) printf("%3.0f\t",pStu->score[j]); } pStu++; printf("\n"); }}void Read(char *fileName){

Page 44: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: FILE *fp; int i; struct student stud[3]; if((fp=fopen(filename,"r"))==NULL) { printf("不能打开文件 \n"); return; } for( i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student),1,fp);

Page 45: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:} fclose(fp); Output(stud);}void RandomRead(char *filename,int i){ FILE *fp; struct student stud; if((fp=fopen(filename,"r+"))==NULL) { printf("不能打开文件 \n"); return;

Page 46: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: } fseek(fp,i*sizeof(struct student),0); fread(&stud,sizeof(struct student),1,fp); fclose(fp); stud.score[1]=85.0f; RandomWrite(filename,stud,i);}void RandomWrite(char *fileName,struct student stud,int i){ FILE *fp; if((fp=fopen(filename,"r+"))==NULL) {

Page 47: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: printf("不能打开文件 \n"); return; } fseek(fp,i*sizeof(struct student),0); if(fwrite(&stud,sizeof(struct student),1,fp)!=1) { printf("文件写入错误 \n"); fclose(fp); return; } fclose(fp);}

Page 48: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.1 文件的定位10.2.1.1 rewind函数10.2.1.1 rewind函数

(1) 语法。rewind(文件指针 );

例如:

rewind(fp);

(2) 语义。

使位置指针重新返回文件的开头。函数没有返回值。

Page 49: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.1 文件的定位10.2.1.2 fseek函数10.2.1.2 fseek函数

(1) 语法。

fseek(文件指针 ,位移量 ,起始点 );

例如:

fseek(fp,sizeof(struct student),0);

Page 50: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.1 文件的定位10.2.1.2 fseek函数10.2.1.2 fseek函数

(2) 语义。

“ ”起始点 用 0,1 或 2代替, 0 “ ”代表 文件开始 ; 1为“ ”当前位置 ; 2 “ ”为 文件末尾 。“ ” “ ”位移量 指以 起始点 为基点,向前移动的字节数。 ANSI C和大多数 C版本要求位移量是 long型数据。这样当文件的长度大于 64 K时不致出问题。 ANSI C标准规定在数字的末尾加一个字母 L,就表示是 long型。用 fseek函数可以实现改变文件的位置指针。

Page 51: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.1 文件的定位10.2.1.3 ftell函数10.2.1.3 ftell函数

(1) 语法。

ftell(文件指针 );

例如:

long i=ftell(fp);

Page 52: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.1 文件的定位10.2.1.3 ftell函数10.2.1.3 ftell函数

(2) 语义。

得到流式文件中的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,人们往往不容易知道其当前位置。用 ftell函数可以得到当前位置。如果 ftell函数返回值为 -1L,表示出错。

Page 53: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写【例 10-4 】把 6 条学生数据记录保存到文件中,要求将其中第 0,2,4 个学生数据读入到计算机,并在屏幕上输出来。程序如下:

【例 10-4 】把 6 条学生数据记录保存到文件中,要求将其中第 0,2,4 个学生数据读入到计算机,并在屏幕上输出来。程序如下:

#define SIZE 6struct student{ char name[10]; char sex [3]; int age; char address[20];};

Page 54: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写struct student stu[SIZE]={{"WangPin"," 男 ",20,"GuangZhou"}, {"LiXia"," 女 ",18,"WuHan"}, {"GuoXin"," 女 ",19,"BeiJing"}, {"ChengTao"," 男 ",22,"ShangHai"}, {"DongLi"," 女 ",20,"NanJing"}, {"XiaoGang"," 男 ",23,"ShenYang"}}; void Save(char *fileName);void RandomRead(char *fileName);void Output(struct student *pStu); void main(){

Page 55: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写 char *fileName="student.dat"; Save(fileName); RandomRead(fileName);}void Output(struct student *pStu){ printf("%s\t%s\t%d\t%s\n",pStu->name,pStu->sex,pStu->age,pStu->address);}void Save(char *fileName){ FILE *fp; int I;

Page 56: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写 if((fp=fopen(filename,"w"))==NULL) { printf("不能打开文件 \n"); return; } for( i=0;i<SIZE;i++) { if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1) { printf("文件写入错误 \n"); break; } }

Page 57: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写 fclose(fp);}void RandomRead(char *fileName){ FILE *fp; int i; if((fp=fopen(filename,"r"))==NULL) {printf("不能打开文件 \n"); return; } struct student stud;

Page 58: 项目 10   学生成绩单的保存与读取

任务 10.2 更新文件中的学生成绩信息

10.2.2 文件的随机读写 for(i=0;i<SIZE;i+=2) { fseek(fp,i*sizeof(struct student),0); fread(&stud,sizeof(struct student),1,fp); Output(&stud); } fclose(fp);}

Page 59: 项目 10   学生成绩单的保存与读取