C语言程序设计课件:文件_第1页
C语言程序设计课件:文件_第2页
C语言程序设计课件:文件_第3页
C语言程序设计课件:文件_第4页
C语言程序设计课件:文件_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文件第一节文件的基本概念与分类第二节打开和关闭文件第三节文件的顺序读写第四节随机文件的读写第五节项目任务:项目案例综合实现第一节文件的基本概念与分类文件是程序设计中一个重要的概念。所谓“文件”一般指存储在外部介质(如磁盘等)上的一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找到存储在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。向外部介质上存储数据也必须先建立一个文件,才能向它输出(写)数据。从文件数据的组织形式即数据在磁盘上的存储形式看,C语言的文件可分为ASCII文件和二进制文件。ASCII文件:又称为文本文件(text)文件,特点是数据在外部介质中存放时一个字节存放一个ASCII码字符。例如:整数1024的ASCII码存储形式为:上面可以看出,以ASCII形式存放需要占用4个字节。二进制文件:将内存中的数据存入磁盘的时候不需要进行数据转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致。int型的1024若按二进制输出则占用2个字节。例如:整数1024的二进制存储形式为:001100010011000000110010001101000000010000000000从上面可以看出,在ASCII文件中采用ASCII码的形式保存数据,每个字符都是以ASCII码形式存储,方便了对字符的逐个处理,在操作系统下也可以直接识别,但占用的磁盘存储空间较多,同时还要付出由二进制形式向ASCII码转换的时间开销。用二进制形式存储可以节省磁盘空间和转换时间,但输出的形式由于是内存中的表示形式,所以一般不能直接识别。因此,一般中间数据用二进制文件保存,输入输出使用ASCII文件。从用户使用的观点看,文件可分为普通文件和设备文件。普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序;也可以是一组待输入处理的原始数据,或者是一组输出的结果。设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。例如将键盘看作是输入文件,将显示器和打印机看作是输出文件。在C语言中,对外部设备的输入输出处理过程就是读写设备文件的过程。例如:将打印机作为设备文件时,可使用由系统命名的PRN文件(即打印机文件)直接输出,所有向PRN文件传送信息的操作就是向打印机输出打印信息。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf,putchar函数就是这类输出。键盘通常被指定为标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。因此,C语言中可将普通文件和设备文件统一作为逻辑文件来看待并采用相同的操作方法,从而大大地方便了程序设计。从C语言处理文件的方法看可以将文件分为“缓冲文件系统”和“非缓冲文件系统”两类。缓冲文件系统是指对每个正在使用的文件,系统自动地在内存区开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘。如果从磁盘向内存读入数据,则从磁盘文件中先将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。ANSIC只采用缓冲文件系统。非缓冲文件系统是指系统不自动开辟确定大小的缓冲区,而是由程序为每一个文件设定确定大小的缓冲区,它占用的是操作系统的缓冲区,而不是用户存储区。第二节打开和关闭文件程序中要实现对文件的处理,先必须在内部文件与外部文件之间建立联系,打开文件,所谓打开文件,实际上是建立文件的各种有关信息,并使文件指针指向该文件,然后才可对文件进行操作。文件最基本的操作是读写操作,操作完成后应当切断内部文件与外部文件之间的联系,关闭文件,也就是要断开文件指针与文件之间的联系。对文件进行的所有操作通过C编译系统提供的标准函数完成,这些函数的信息包含在头文件“stdio.h”中。一、文件指针要调用一个文件,需要以下信息:(1)文件当前的读写位置,该位置指文件存放在哪个磁介质中。(2)与该文件对应的内存缓冲区的地址,缓冲区的地址一般由系统自动提供。(3)缓冲区中未被处理的字符数,即是否有数据未被处理。(4)文件操作方法,指读数据还是写数据。缓冲区为每一个文件开辟一个“文件信息区”用来存放以上这些信息,这个信息区在内存中,是一个结构体变量。只要程序用到一个文件,系统就要为此文件开辟一个这样的一个结构体变量。有几个文件,就开辟几个这样的一个结构体变量,分别用来存放各个文件的有关信息。这些结构体变量不用变量名来标识,而是设置一个指向该结构体变量的指针变量,通过它来访问该结构体变量。因此,在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为:FILE*指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。例如:FILE*fp;表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。二、文件的打开(fopen()函数)所谓“打开”,是指在程序和操作系统之间建立起联系,程序把所要操作的文件的一些信息通知给操作系统。这些信息中除包括文件名外,还要指出读写方式及读写位置。如果是读,则需要先确认此文件是否已存在;如果是写,则检查原来是否有同名文件,如有则将该文件删除,然后新建立一个文件,并将读写位置设定于文件开头,准备写入数据。fopen函数用来打开一个文件,其调用的一般形式为:FILE*fp;fp=fopen(文件名,使用文件方式);其中,fp是文件指针名,“文件指针名”必须是被说明为FILE类型的指针变量,“文件名”是被打开文件的文件名。“使用文件方式”是指文件的类型和操作要求。例如:FILE*fp;fp=fopen(“file1”,”r”);其意义是在当前目录下打开文件file1,并且以“读”方式打开,同时返回指向该文件的指针并赋给fp。又如:FILE*fp1;fp1=("d:\\file2',"w");其意义是打开D驱动器磁盘的根目录下的文件file2,并且以“写”方式打开。两个反斜线“\\”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下表就是它们的符号和含义。表9-1文件使用方式表说明:(1)用r(只读)方式打开文件只能用于程序从文件输入数据,不能向文件输出数据,而且要求该文件已经存在,不能打开一个并不存在的用于“r”方式的文件,否则函数fopen()将返回空指针NULL。(2)用w(只写)方式打开的文件只能用于向文件输出数据,不能从该文件中输入数据,如果打开时原文件不存在,则新建一个以指定名字命名的文件,如果原来已存在一个以该文件名命名的文件,则在打开时将该文件删去,然后重新建立一个以该名字命名的新文件。(3)用a(追加)方式打开的文件,表示不删除原文件里的数据,而是从文件的末尾开始填加数据,要求被打开的文件已经存在,打开后,文件的位置指针将定位在文件的末尾,如果打开的文件已经存在,则函数fopen()返回一个空指针NULL。(4)用r+,w+,a+(读/写)方式打开的文件,既可以从文件输入数据,也可以向文件输出数据,其中r+只允许打开已存在的文件,用w+方式打开,则系统新建一个文件,先向文件输出数据,然后才能从文件中输入数据。用a+方式是打开已经存在的文件,并且文件的位置指针定位在文件的末尾,先准备向文件添加数据,以后也可以从文件中输入数据。(5)上述打开的文件都是针对文本文件,如果要打开二进制文件,必须在使用方式后面添上字符b,如rb表示以只读方式打开一个二进制文件。(6)如果用r方式打开一个并不存在的文件,或磁盘损坏、磁盘空间不足等情况下打开文件,都会使打开文件失败。此时fopen函数将返回一个空指针NULL。所以常用下面的方法打开一个文件。if((fp=fopen(“file1”,”r”))==NULL){printf(“cannotopenthisfile\n”);exit(0);

)这个程序的意义是:如果在以只读的方式打开文件file1时,返回的是空指针NULL,则表示该文件打开失败,则在屏幕上给出提示信息“cannotopenthisfile”。Exit函数的作用是关闭所有文件,终止正调用的过程。三、文件的关闭(fclose()函数)一个文件使用完后应该及时关闭它,以防止它再被误用,一方面可以避免文件的数据丢失,另一方面是及时释放内存,减少系统资源的占用。“关闭”就是指文件指针变量不再指向该文件,也就是文件指针变量与该文件“断开”,此后不能通过该指针变量对原来与其相联系的文件进行读写操作,除非再次打开,使文件指针变量重新指向该文件。fclose函数的调用方式如下:FILE*fp;fclose(fp);其中,fp是打开此文件时所返回的指针值,fclose()的作用是撤消文件指针变量与文件的联系,同时自动释放分配给文件的缓冲区。fclose函数也返回一个整型值,如果正常执行了文件关闭操作,则返回值为0;否则返回EOF,EOF是系统在头stdio.h中定义的符号常量,其值为-1。【案例9-1】编写程序将D盘上的文件file1.txt打开,如果文件存在,则以读的方式打开,否则说明文件不存在。#include<stdio.h>main(){FILE*fp;/*定义一个文件指针fp*/fp=fopen(“d:\\file1.txt”,”r”);/*用“读”方式打开文本文件file1.txt*/if(fp==NULL){printf(“该文件不存在\n”);exit(0);}elseprintf(“文件已经打开\n”);fclose(fp);/*关闭文本文件file1.txt*/}【注意】如果D盘根目录下存在文件file1.txt,以上程序运行后在屏幕上显示文件已经打开,如果文件不存在,屏幕上显示该文件不存在,并结束程序的运行。第三节文件的顺序读写在C语言中提供了多种文件读写的函数:一、字符读写函数fgetc和fputc1、fgetc函数它的功能是以字符(字节)为单位,每次可从文件读出一个字符。函数的调用方式为:fgetc(FILE*fp);其中fp是文件指针变量,所指向的文件必须是以读或读写方式打开的。返回值:fgetc函数有一个返回值,如果正常返回,则返回读取的字符代码。否则返回EOF;如果读到文件结束符(^Z)时,也返回EOF,可以用它来判断是否读完了文件中的数据。2、fputc函数它的功能是以字符(字节)为单位,每次可向文件写入一个字符。函数的调用方式为:intfputc(charch,FILE*fp);其中ch是要输出的字符,它可以是字符常量或字符变量。fp是文件指针变量,指向当前打开的文件。返回值:fputc函数有一个返回值,如果写入成功则返回写入的字符,如果失败则返回一个EOF。EOF是在stdio.h文件中定义的符号常量,值为-1。【案例9-2】从键盘输入一个字符串,写入文件test.txt中,将小写字母全部转换成大写字母,再把该文件内容读出来显示在屏幕上。#include<stdio.h>main(){FILE*fp;charch1,ch[50];inti=0;fp=fopen("test.txt","w");/*用"写"方式打开文本文件test.txt*/printf("请输入一个字符串:\n");while((ch[i]=getchar())!='\n')/*输入字符直到按回车为止*/{if(ch[i]>='a'&&ch[i]<='z')/*判断字符是否是小写字母*/ch[i]=ch[i]-32;/*如果是小写字母,就转换成大写字母*/fputc(ch[i],fp);/*将转换后的字符写入文件指针fp所指的文件中*/i++;}fclose(fp);if((fp=fopen("test.txt","r"))==NULL)/*用"读"方式打开文本文件test.txt*/ { printf("不能打开文件.\n"); exit(0); }ch1=fgetc(fp);/将字符从文件指针fp所指的文件中读出*/while(ch1!=EOF)/*判断是否到了文件的末尾*/{putchar(ch1);ch1=fgetc(fp);}printf("\n");fclose(fp);}【说明】(1)程序中首先以写的方式打开文件,每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已经指向文件末尾。如果要把文件从头读出,必须先关闭文件,再将文件以读的方式打开。(2)第二个while循环每执行一次,fgetc函数就从fp所指的文件中读出一个字符给字符变量ch1,并且用putchar函数将它显示在屏幕上。二、字符串的读写函数fputs和fgets1、fgets函数它的功能是从指定的文件中读一个字符串到字符数组中。函数的调用方式为:fgets(char*str,intn,FILE*fp);其中str为读取到的字符串的地址,可以是指针,也可以是数组,n为限定每次读取的字符个数,fp为指定读取的文件指针。返回值:从fp所指向的文件当前读写位置开始,最多读入(n-1)个字符(包括换行符),在读入的最后一个字符后加上字符串结束标志'\0'。正常返回值为str的首地址,当读到文件末尾或出错时,返回NULL。例如:fgets(str,n,fp);其意义是从fp所指的文件中读取n-1个字符送入字符数组str中。2、fputs函数它的功能是是向指定的文件写入一个字符串。函数的调用方式为:fputs(char*str,FILE*fp);其中str为指定输出的字符串,它可以是指针、数组名或字符串,fp为指定的输出文件。返回值:正常返回值为所输出的字符串中最后一个字符的ASCII值,如果向文件写入字符串不成功,则返回值为EOF。例如:fputs("wxm",fp);其意义是把字符串"wxm"写入fp所指的文件中。【案例9-3】编制一个程序实现文本文件的复制功能。分析:将文件1的内容复制到文件2中,通过while循环每次使用fgets函数从文件1中读取80个字符写入文件2中,直到遇见文件1的结束标志EOF。include<stdio.h>main(){FILE*fp1,*fp2;charstring[81];/*最多保存80个字符,外加一个字符串结束标志*/charfile1[20],file2[20];printf("输入文件名1:");scanf("%s",file1);printf("输入文件名2:");scanf("%s",file2);if((fp1=fopen(file1,"r"))==NULL)/*以"只读"方式打开文件1*/{printf("文件不能读");exit(0);}if((fp2=fopen(file2,"w"))==NULL)/*以"写"方式打开文件2*/{printf("文件不能写");exit(0);}while(fgets(string,81,fp1)!=NULL)/*如果未读到文件末尾(EOF),函数不会返回NULL,继续循环(执行循环体)*//*从fp1所指向的文件一次读80个字符,遇换行或EOF,提前带回字符串*/printf("%s",string);/*打印字符串*/fputs(string,fp2);/*将字符串写入fp2所指向的文件*/fclose(fp1);/*关闭文件*/fclose(fp2);}【案例9-4】现在我们将在前面几章编写的“学生成绩管理系统”中的输入函数shuru()做一些小的修改,将学生的各项信息从键盘输入后,直接存放在一个文本文件---成绩统计.txt里,以方便我们进行成绩的管理。#defineN1000#include<stdio.h>#include<stdlib.h>structscore{intmingci;charxuehao[8];charmingzi[20];floatscor[6];}data,info[1000];inti,j,k=0;chartemp[20],ch;FILE*fp;voidshuru(){chartemp[20],ch;chars[30];if((fp=fopen("成绩统计.txt","a+"))==NULL){printf("cannotopenthisfile.\n");getch();exit(0);}for(i=0;i<=N;i++){printf("\n请输入学号:");gets(data.xuehao);fputs(data.xuehao,fp);printf("请输入名字:");gets(data.mingzi);fputs(data.mingzi,fp);printf("请输入语文分数:");gets(temp);data.scor[0]=atof(temp);/*将字符串转换成浮点数*/fputs(temp,fp);printf("请输入数学分数:");gets(temp);data.scor[1]=atof(temp);fputs(temp,fp);printf("请输入英语分数:");gets(temp);data.scor[2]=atof(temp);fputs(temp,fp);

printf("请输入物理分数:");gets(temp);data.scor[3]=atof(temp);fputs(temp,fp);printf("请输入化学分数:");gets(temp);data.scor[4]=atof(temp);fputs(temp,fp);data.scor[5]=data.scor[0]+data.scor[1]+data.scor[2]+data.scor[3]+data.scor[4];sprintf(s,"%4.1f",data.scor[5]);/*将浮点数转换成字符串*/fputs(s,fp);}fclose(fp);}main(){shuru();}三、数据块读写函数fwrite和fread它的功能是以一个指定大小的数据块(由多个数据组成)为单位从文件中读数据。函数的调用方式如下:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);函数功能:用来读写一个数据块。其中:(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。(2)size:是指出一次读写一个数据块时,数据块中所包含的字节数。(3)count:是指要读写的数据块块数。(4)fp:是文件指针。返回值:如果函数执行成功,则返回值为count;如果函数执行出错,则出现错误提示;如果size或count为0,则返回值为0。【案例9-5】从键盘输入3个员工的有关数据,将它们存入文件staff,然后再从文件中读出数据,显示在屏幕上。#include"stdio.h"voidfsave();/*原型*/structstaff/*结构体类型的声明*/{intnum;charname[10];intage;charaddress[15];}st[3],st1[3];/*定义一个结构体类型数组*/voidfsave(){FILE*fp;inti;if((fp=fopen("staff","wb"))==NULL)/*以"写"的方式打开一个二进制文件,然后判断是否打开成功*/{printf("cannotopenfile\n");exit(0);}for(i=0;i<3;i++)if(fwrite(&st[i],sizeof(structstaff),1,fp)!=1)/*把读取的数据块写入文件,并判断是否到文件末尾或出错*/printf("filereaderror\n");/*写过程中的出错处理*/fclose(fp);/*关闭文件*/}voidmain(){inti;FILE*fp;for(i=0;i<3;i++)/*从键盘读入员工数据*/scanf("%s%d%d%s",st[i].name,&st[i].num,&st[i].age,st[i].address);fsave();/*将员工数据存入磁盘文件*/if((fp=fopen("staff","rb"))==NULL)/*以"读"的方式打开一个二进制文件,然后判断是否打开成功*/{printf("cannotopenfile\n");exit(0);}for(i=0;i<3;i++)if(fread(&st1[i],sizeof(structstaff),1,fp)!=1)/*从staff文件中读取一个数据块,并判断是否到文件末尾或出错*/{if(feof(fp))return;/*如果到文件末尾则返回*/printf("filereaderror\n");}for(i=0;i<3;i++)/*j将读出的数据在屏幕上显示出来*/printf("%-10s%4d%4d%-15s\n",st1[i].name,st1[i].num,st1[i].age,st1[i].address);}【说明】(1)结构体类型数组st有3个元素,每个元素都是结构体类型,代表3个数据块。(2)执行fread(&st[i],sizeof(structstaff),1,fp)语句后,从文件起始位置起,将结构体类型数组st中的3个元素的有关数据一一写到文件中,用表达式sizeof(structstaff)计算该数据块的字节数,数字1表示每次写1个数据块。第四节随机文件的读写前面介绍的文件读写方式都是顺序读写,从文件的开头依次顺序读写每一个数据。由指向文件的指针自动移位。但在实际对文件的应用中,还往往需要对文件中某一个特定的数据进行处理,这就要求对文件具有随机读写的功能,也就是强制将文件的指针指向用户所希望的指定位置。这就是所谓对文件的定位与随机读写,C语言对文件的定位提供了三个函数。一、位置复位函数rewind()函数的调用方式如下:

Rewind(fp);

其中fp是文件指针。此函数没有返回值。函数功能:使fp指定的文件的位置指针重新定位到文件的开头位置。二、改变文件位置指针函数fseek()函数的调用形式:

fseek(fp,offset,position)函数功能:将文件内部位置指针移动到指定位置,如果函数读写指针移动失败,返回值为-1。参数说明:fp是文件指针,position是起始点,表示以文件的什么位置为基准进行移动。positon的值用整常数表示,ANSIC允许它有下列三个值之一:0-----文件的开头;1-----文件的当前位置;2-----文件的末尾。offset是位移量,它表示以起始点position到要确定的新位置的字节数。ANSIC要求位移量是long类型数据,以便在文件长度大于64KB时不会出错。如果位移量为正数,是从文件开头向文件末尾移动,如果如果位移量为负数,表示是从文件末尾向文件开头移动。fseek函数一般用于二进制文件。例如:Fseek(fp,30L,0);/*将文件位置指针移动到文件头起始第30个字节处*/Fseek(fp,30L,1);/*将文件位置指针从当前位置向前(文件尾方向)移动30个字节*/Fseek(fp,-30L,2);/*将文件位置指针从文件末尾向后(文件头方向)移动30个字节*/三、ftell函数函数的调用方式如下:

ftell(fp);其中fp是一个文件指针。函数功能:得到fp所指向文件的当前位置,该值是一个长整型数,是文件位置指针从文件开始处到当前位置的位移量的字节数。如果函数的返回值为-1L,表示出错。第五节项目任务:项目案例综合实现【项目案例】“学生成绩管理系统”设计实现分析:在以前的程序中,当我们处理数据时,总是通过键盘对数据一一进行输入,这在反复处理大批量的数据的时候就很不方便。那我们能否预先将数据统一输入,再来对数据进行处理呢?答案是肯定的,最常用的方法就是将这些数据写入到一个文件里,再将这个文件存放在磁盘上,需要时再将数据从该文件中读取并进行处理。我们现在就采用fwrite函数将学生的成绩信息保存在磁盘文件,然后将这些数据通过fread函数从文件中读出。全部程序代码如下:#include"stdio.h"/*I/O函数*/#include"stdlib.h"/*其它说明*/#include"string.h"/*字符串函数*/#include"conio.h"/*屏幕操作函数*/#include"mem.h"/*内存操作函数*/#include"ctype.h"/*字符操作函数*/#include"alloc.h"/*动态地址分配函数*/structscore{intmingci;charxuehao[8];charmingzi[20];floatscor[6];}data,info[1000];inti,j,k=0;chartemp[20],ch;FILE*fp,*fp1;voidshuru(){if((fp=fopen("成绩统计.txt","a+"))==NULL){printf("cannotopenthisfile.\n");getch();exit(0);}for(i=0;i<=1000;i++){printf("\n请输入学号:");gets(data.xuehao);printf("请输入名字:");gets(data.mingzi);printf("请输入语文分数:");gets(temp);data.scor[0]=atof(temp);printf("请输入数学分数:");gets(temp);data.scor[1]=atof(temp);printf("请输入英语分数:");gets(temp);data.scor[2]=atof(temp);printf("请输入物理分数:");gets(temp);data.scor[3]=atof(temp);printf("请输入化学分数:");gets(temp);data.scor[4]=atof(temp);data.scor[5]=data.scor[0]+data.scor[1]+data.scor[2]+data.scor[3]+data.scor[4];

fwrite(&data,sizeof(data),1,fp);printf("是否继续输入?y/n");ch=getche();if(ch=='n'||ch=='N')break;}fclose(fp);}voidxianshi(){floats;intn;if((fp=fopen("成绩统计.txt","r+"))==NULL){printf("Cannotreadingthisfile.\n");exit(0);}for(i=0;i<=1000;i++){if((fread(&info[i],sizeof(info[i]),1,fp))!=1)break;}printf("\n学号名字语文数学英语物理化学总分\n");for(j=0,k=1;j<i;j++,k++){info[j].mingci=k;printf("%6s%8s%3.1f%3.1f%3.1f%3.1f%3.1f%3.1f\n",info[j].xuehao,info[j].mingzi,info[j].scor[0],info[j].scor[1],info[j].scor[2],info[j].scor[3],info[j].scor[4],info[j].scor[5]);}getch();fclose(fp);}voidxiugai(){if((fp=fopen("成绩统计.txt","r+"))==NULL||(fp1=fopen("temp.txt","w+"))==NULL){printf("Cannotopenthisfile.\n");exit(0);}printf("\n请输入修改学号:");scanf("%d",&i);getchar();while((fread(&data,sizeof(data),1,fp))==1){j=atoi(data.xuehao);if(j==i){printf("学号:%s\n名字:%s\n",data.xuehao,data.mingzi);printf("请输入名字:");gets(data.mingzi);printf("请输入语文分数:");gets(temp);data.scor[0]=atof(temp);printf("请输入数学分数:");gets(temp);data.scor[1]=atof(temp);printf("请输入英语分数:");gets(temp);data.scor[2]=atof(temp);printf("请输入物理分数:");gets(temp);data.scor[3]=atof(temp);printf("请输入化学分数:");gets(temp);data.scor[4]=atof(temp);data.scor[5]=data.scor[0]+data.scor[1]+data.scor[2]+data.scor[3]+data.scor[4];

}fwrite(&data,sizeof(data),1,fp1);}fseek(fp,0L,0);fseek(fp1,0L,0);while((fread(&data,sizeof(data),1,fp1))==1){fwrite(&data,sizeof(data),1,fp);}fclose(fp);fclose(fp1);}voidchazhao(){if((fp=fopen("成绩统计.txt","r"))==NULL){printf("\nCannotopenthisfile.\n");exit(0);}printf("\n请输入学号查看:");scanf("%d",&i);while(fread(&data,sizeof(data),1,fp)==1){j=atoi(data.xuehao);if(i==j){ printf("学号:%s名字:%s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论