C语言基础及教程 7_第1页
C语言基础及教程 7_第2页
C语言基础及教程 7_第3页
C语言基础及教程 7_第4页
C语言基础及教程 7_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

学习目标

理解文件的概念和文件的基本操作

掌握文本文件和二进制文件的读写方法

掌握文件的定位方法

掌握学生成绩管理系统中的信息保存方法

增强对数据的安全防范意识案例导入案例10收官篇:用文件完善学生成绩管理系统【问题描述】在学生成绩管理系统中,每次运行程序时都要通过键盘输入数据。程序退出数据也消失,数据只能保存在内存中,不能长期保存。本任务使用外部存储文件来保存数据,实现对数据的存储和读取,能安全有效地长期保存数据,还能提供数据共享。

【问题分析】案例9中的数据是存储在内存中的,程序结束数据全部消失。如果能将数据保存在文件中,将大大减少输入工作量,而且输出的结果也可以长期保留。问题的要点是:(1)如何将内存中的数据存储在文件中(2)反之,如何从磁盘文件中的数据载入内存。知识学习【知识准备】要完成上面的任务,必须了解文件的基本概念,熟练掌握文件读写函数,用文件完善学生成绩管理系统。知识学习:10.1文件的基本知识10.2文件的打开和关闭10.3顺序读写数据文件10.4随机读写数据文件10.5学生成绩管理系统的数据存取10.6综合应用第二知识空间:return语句和exit()函数10.1文件的基本知识10.1.1文件的存储方式文件名的一般形式:文件名.[扩展名]其中扩展名可选,按类别命名,例如,C语言源程序的扩展名是C,可执行文件的扩展名是EXE,等等。数据文件的两种存储方式:

(1)文本文件:按ASCII码存储,也称ASCII码文件。这种文件在保存时,每个字符对应一个字节,用于存储对应的ASCII码。(2)二进制文件:按二进制码存储,称为二进制文件。是按二进制的编码方式来保存文件内容。(‘1’)(‘0’)(‘2’)图10-1短型整数102的存储形式示意在内存中的存储形式0000000001100110ASCII码存储形式001100010011000000110010二进制存储形式000000000110011010.1文件的基本知识10.1.2文件的处理方式两种处理方式:“缓冲文件系统”和“非缓冲文件系统”。(1)缓冲文件系统又称为标准文件系统或高层文件系统,是目前常用的文件系统。(2)非缓冲文件系统又称为低层文件系统,它提供的文件输入输出操作函数更接近于操作系统。因此,与机器有关,使用较为困难,但它节省内存,执行效率较高。10.1文件的基本知识10.1.3文件类型指针

要使用一个文件,系统将在内存中为这一文件开辟一个“文件信息区”,用来存放文件的有关信息,如文件当前的读写位置、缓冲区大小、当前缓冲区的相对位置等。这些信息保存在一个结构体中,定义在stdio.h的头文件中。Dev-C++5.11系统中具体定义形式为:struct_iobuf{char*_ptr;

//文件输入的下一个位置int_cnt; //当前缓冲区的相对位置char*_base; //数据缓冲区的位置int_flag; //文件状态标志int_file; //用于有效性检验int_charbuf; //如无缓冲区不读取字符int_bufsiz; //缓冲区的大小char*_tmpfname; //临时文件名};typedefstruct_iobufFILE;C语言对文件的操作是定义一个FILE的指针,例如:FILE*fp;通过fp使用结构体变量中的文件信息访问文件。10.2文件的打开和关闭10.2.1文件的打开

使用fopen()函数来打开文件。格式:FILE*fp;fp=fopen("文件名","操作方式");

功能:以指定的操作方式打开一个文件。

说明(1)fopen()函数在执行时返回一个FILE类型的指针,赋给一个文件指针变量fp,使fp与被打开的文件联系起来,而后对文件的读写操作就可以通过fp来进行。(2)“文件名”指要打开文件的文件名,若不在当前目录下,则要写绝对路径。(3)“操作方式”是指对打开文件的访问形式,取值及含义见表10-1。10.2.1文件的打开表10-1文件操作方式及含义10.2文件的打开和关闭10.2.2文件关闭使用完一个文件后,应使用fclose()函数及时关闭。fclose()函数和fopen()函数一样,原型也在stdio.h中,调用的一般形式为:fclose(文件指针);例如:fclose(fp);fclose函数也带回一个值,当正常完成关闭文件时,fclose函数返回值为0(NULL),否则返回EOF。10.3顺序读写数据文件10.3.1对文件读写一个字符从文本文件中读取一个字符和向文件写入一个字符的函数见表10-2。

文件的顺序读写操作,主要包括:读写字符、读写字符串、读写二进制数据块和格式化读写。10.3顺序读写数据文件算法设计:(1)调用fopen()库函数,以写方式打开文本文件student.txt。(2)用循环语句,调用字符输入函数getchar()和写字符函数fputc(),把输入字符写入文件。(3)调用fclose()关闭打开的文件。

【例10.1】从键盘输入若干字符,然后逐个把它们写入指定文件student.txt中去,以回车结束输入。当输入如图10-3所示的内容时,则在student.txt文件中的内容如图10-4所示。10.3顺序读写数据文件#include<stdio.h>#include<stdlib.h>intmain(void){charch;FILE*fp;/*定义文件指针*/if((fp=fopen("E:\\CDemo\\student.txt","w"))==NULL)/*①写方式打开文件student.txt*/{ printf("\n打开文件student.txt失败!\n"); exit(0); /*终止程序运行*/}ch=getchar(); /*②getchar()返回一个字符赋给ch*/while(ch!='\n')/*②当输入换行'\n'时结束循环*/{ fputc(ch,fp);/*②将读入的字符写到磁盘文件中*/ ch=getchar();/*②getchar()继续带回一个字符赋给ch*/}fclose(fp);/*③关闭文件*/return0;}10.3顺序读写数据文件算法设计:(1)调用fopen()库函数,以读方式打开文本文件student.txt。(2)循环调用读字符函数fgetc()和字符输出函数putchar(),把字符显示在屏幕上。(3)调用fclose()库函数关闭打开的文件。

【例10.2】顺序读出并在屏幕上显示例10.1创建的文本文件student.txt。程序运行结果如图10-5所示。10.3顺序读写数据文件#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp; /*定义文件指针*/intch;if((fp=fopen("E:\\CDemo\\student.txt","r"))==NULL)/*以读方式打开文件*/{ printf("打开文件student.txt失败!\n"); exit(0); /*终止程序运行*/}ch=fgetc(fp);/*fgetc()函数带回一个字符赋给ch*/while(ch!=EOF)/*当读入的字符值等于EOF时结束循环*/{ putchar(ch); /*将读出的字符在屏幕上显示*/ ch=fgetc(fp);/*fgetc()函数继续带回一个字符赋给ch*/}fclose(fp); /*关闭打开的文件*/return0;}10.3顺序读写数据文件10.3.2对文件读写一个字符串

函数fgetc()和fputc()一次只能读写文件中的一个字符,因此,如果文件student.txt的大小为1000个字节或更多,则该实例中的while循环就要执行1000次或更多,显然效率比较低。下面介绍读写一个字符串的函数见表10-3。

10.3顺序读写数据文件【例10.3】从键盘输入5个字符串存储到磁盘文件out.txt中算法设计:(1)调用fopen()库函数,以写方式,打开文本文件out.txt。(2)用循环语句,调用字符串输入函数gets()和写字符串函数fputs(),把输入字符串写入文件。(3)调用fclose()库函数关闭打开的文件。intmain(void){FILE*fp;charstr[81],i;if((fp=fopen("E:\\CDemo\\out.txt","w"))==NULL){ puts("打开文件out.txt失败!\n"); exit(0);/*终止程序运行*/}for(i=0;i<5;i++){ gets(str);/*输入一个字符串*/ fputs(str,fp);/*str字符串写到文件中*/ fputs("\n",fp);/*字符串后加换行符'\n’*/}fclose(fp);/*关闭打开的文件*/return0;}10.3顺序读写数据文件10.3.3二进制文件的读写

多数文件是以二进制方式存储,且需要对整块数据进行读写。下面介绍块读写函数fread()和fwrite(),见表10-4。例如:inta[5]={1,2,3,4,5};fwrite(a,4,5,fp);//将数组a中的5个整数写入fp指向的文件中fread(a,4,5,fp);//从fp所指定的文件读入5个整数,存储在数组a中10.3顺序读写数据文件【例10.5】从键盘输入10个整数,并存储在磁盘文件a1.dat中。#include<stdio.h>#include<stdlib.h>intmain(void){

FILE*fp;intiData[10],i;for(i=0;i<10;i++) scanf("%d",&iData[i]);/*从键盘输入10个整数存储在数组iData中*/ if((fp=fopen("E:\\CDemo\\a1.dat","wb"))==NULL)/*以二进制方式打开文件*/ { printf("打开文件a1.dat失败!\n"); exit(0); /*终止程序运行*/ } fwrite(iData,sizeof(int),10,fp);/*iData为首地址,写10*sizeof(int)个字节*/fclose(fp);return0;}10.3顺序读写数据文件10.3.4文本文件的格式化读写

文件的格式化输入/输出函数fscanf()/fprintf(),与前面介绍的scanf()/printf()函数的作用类似,都是用来实现格式化读写操作,不同之处是fscanf()/fprintf()的读写对象是磁盘文件,而不是键盘和屏幕。见表10-5。例如:inta=12;fprintf(fp,"data=%d",a);//将data=12写入fp指向的文件中例如:inta;fscanf(fp,"data=%d",&a);//从fp指向的文件中读去数据并存储在变量a中10.3顺序读写数据文件【例10.7】录入表10-6中的N名学生的信息,并存入文件student2.txt中,要求:(1)除学生基本信息外,还要包括相应的字段名信息。例如,age=16等。(2)每个学生的记录数据各占一行。10.3顺序读写数据文件intmain(void){FILE*fp;inti,age;charname[16];longno;floatscore;if((fp=fopen("E:\\CDemo\\student2.txt","w"))==NULL)/*以写方式打开文件*/{printf("打开文件student2.txt失败!");exit(1);}printf("请输入学生的数据\n");for(i=0;i<N;i++){/*将第i个学生的数据,并存入文件*/ scanf("%s%ld%d%f",name,&no,&age,&score);fprintf(fp,"Name:%s\n",name); fprintf(fp,"No=%ld,Age=%d,Score=%5.2f\n",no,age,score);}fclose(fp);}10.4随机读写数据文件10.4.1文件的定位

有一个“文件位置指针”,用来指示当前读写的位置。打开文件时文件位置指针指向文件开头,每次读写一个字符后,文件位置指针自动移动到下一个字符的位置,通过改变文件指针的位置,可实现读取特定位置的数据,如图10-9所示。

顺序文件的读写是从文件的开始位置进行的,每进行一次读写操作,文件的读写位置自动地发生变化。例如,若读写一个字符后,文件指针自动移向下一个字符位置。

在对文件操作时往往不需要从头开始,只需对任何位置上的数据进行访问,显然这种方法比顺序访问效率要高。10.4.1文件的定位例如:fseek(fp,64L,SEEK_SET);/*从文件头向后移到距文件头64字节*/fseek(fp,-64L,SEEK_CUR);/*从当前位置向文件头方向移动64字节*/fseek(fp,64L,SEEK_CUR);/*从当前位置向文件尾方向移动64字节*/fseek(fp,-64L,SEEK_END);/*从文件尾向文件头方向移动64字节*/10.4文件的定位与随机读写10.4.2随机读写文件【例10.9】从例10.5中生成的a1.dat文件中,读出第6个整数。算法设计:(1)调用fopen()库函数,以读方式打开二进制文件a1.dat。(2)移动文件指针5个整数位置。(3)调用读数据块函数fread(),读出第6个整数并显示。(4)调用fclose()库函数关闭打开的文件。#include<stdio.h>#include<stdlib.h>intmain(void){FILE*fp;intiData;fp=fopen("E:\\CDemo\\a1.dat","rb");if(fp==NULL){ printf("打开文件a1.dat失败!\n"); exit(0);}//移动文件指针5个整数位置fseek(fp,5*sizeof(int),SEEK_SET);//读出第6个整数fread(&iData,sizeof(int),1,fp);printf("%4d\n",iData);//显示fclose(fp);//关闭文件return0;}10.5学生成绩管理系统的数据存取10.5.1添加文件存储函数改进学生成绩管理系统,将存储在结构数组中的数据写入到文件data中去。10.5.2添加文件装入函数与文件存储相反,文件装入就是把磁盘文件读入结构数组以便进一步的数据处理。考虑到函数模块的一般性,将文件名、存储的结构数组,以及记录总数均作为函数的形参。10.5.3修该主函数实现数据存取添加调用文件存储和装入函数语句10.6综合应用案例10-1文本文件加密

【问题描述】在某些情况下,需要对一些文件进行加密处理。编写一个程序来实现文本文件的加密,加密方法是将文件中每个字符按一定的规律转换为其它字符,转换规则如下:(1)大写字母变以字母表中心位置为对称的小写字母,即将A变成z,B变成y,…,Z转换为a。(2)小写字母变以字母表中心位置为对称的大写字母,即将a变成Z,b变成Y,…,z转换为A。(3)其它字符不变。案例10-1文本文件加密算法设计(1)打开待加密文件和加密文件(2)按字符方式,顺序读取待加密文件中的字符,作字符变换,然后顺序写入加密文件。

如果是大写字母,则将大写字母变以字母表中心位置为对称的小写字母,写入文件:

变换到对称位置:ch='M'+'N'-ch;

大写转换为小写:ch=ch+32;

将字符ch变量内容写入加密文件

如果是小写字母,则将小写字母变以字母表中心位置为对称的大写字母,写入文件:

变换到对称位置:ch='m'+'n'-ch;

小写转换为大写:ch=ch-32;

将字符ch变量内容写入加密文件(3)关闭两个文件案例10-1文本文件加密intmain(intargc,char*argv[]){ charch; FILE*f1,*f2; f1=fopen(argv[1],“r”);/*以读方式,打开待加密文件*/ f2=fopen(argv[2],“w”);/*以写方式,打开加密文件*/ while((ch=fgetc(f1))!=EOF){ if(ch>='A'&&ch<='Z’){/*如果是大写字母*、 ch='M'+'N'-ch;/*变到对称位置*/ ch=ch+32;/*将大写字母转换成小写字母*/ } elseif(ch>='a'&&ch<='z’){ /*如果是小写字母*/ ch='m'+'n'-ch;/*变到对称位置*/ ch=ch-32;/*将小写字母转换成大写字母*/ } fputc(ch,f2); } printf("加密成功!\n"); fclose(f1);/*关闭文件*/ fclose(f2);}案例10-2二进制文件的复制【问题描述】文件的复制就是将文件1的内容复制到文件2中(若文件2不存在则建立),使文件2的内容和文件1相同。运行复制文件程序,在命令行内输入程序名、文件1的名称、文件2的名称,进行文件复制。【算法设计】(1)首先判断输入参数个数,如果不等于3,则输出提示信息并退出。(2)将第二、三个参数作为“源文件名”和“目标文件名”打开和创建文件。(3)进行读写操作,实现文件的复制功能。(4)关闭文件案例10-2二进制文件的复制intmain(intargc,char*argv[]){ intb; FILE*f1,*f2; charbuf[bsize]; f1=fopen(argv[1],"rb");/*按二进制读方式打开文件*/ f2=fopen(argv[2],"wb");/*按二进制写方式打开文件*/ while((b=fread(buf,sizeof(char),bsize,f1))>0)/*文件复制*/ { fwrite(buf,sizeof(char),b,f2);

} printf("复制成功!\n");

fclose(f1);/*关闭文件*/ fclose(f2);}案例10-3随机读写文件【问题描述】输入若干个学生信息,保存到指定磁盘文件中,然后要求将奇数条学生信息从磁盘中读入并显示在屏幕上。程序运行结果如图10-10所示。图10-10随机读写文件案例10-3随机读写文件【算法设计】(1)定义结构体类型,代码如下:structstudent

温馨提示

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

评论

0/150

提交评论