您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 第6章 磁盘数据存储
引论经过前几章的学习,我们可以使用数组、结构体等构造数据类型进行复杂编程,并且将任务按功能模块分解,进行比较大型的程序开发了。这里还有一个问题,如果程序处理的数据需要长期保存起来怎么办?虽然数组可以用于存储N本图书的信息,但数组属于程序运行过程中临时变量,当程序运行结束后系统将释放该程序所占的内存区,处理结果就不再保存了。另外,有时程序处理的数据不是从键盘上输入的,而是从数据文件里取出来的。这些将如何实现呢?这就是本章所解决的问题。主要内容6.1将数据写入文件6.2文件的读、写分类函数6.3文件定位函数一、文件的概念1.文件:指存储在外部介质上的数据的集合操作系统是以文件为单位对数据进行管理的.如果想使用存在外部介质上的数据,必须先按文件名找到指定的文件,然后再从文件中读取数据;如果要向外部介质上存储数据,也必须先建立一个文件,再向它输出数据.文件除了包括磁盘上存储的内容外,从操作系统的角度看与主机相连的各种输入输出设备也是文件.例如,键盘是输入文件,显示器是输出文件.2.文件的分类C语言把文件看作是一个字节的序列,即文件是由一个一个字节的数据顺序组成的.根据数据的组织形式把文件分为两类:文本文件和二进制文件.二、文件类型指针要使用一个文件需要有一定的信息,如文件当前的读写位置,与文件对应的内存缓冲区地址,文件的操作方式等.这些信息都存放在“文件信息区”中,“文件信息区”是一个结构体数据,其结构体类型由系统定义,类型名为FILE定义形式:FILE*指针变量名;注意:1.只有通过文件指针变量才能调用相应的文件2.有n个文件就要定义n个文件指针变量,分别对应各个文件3.FILE必须大写例:简单示例,将一串字符’A’~’Z’写入文件保存起来。#includestdio.h#includestdlib.hmain(){charch;FILE*fp;/*定义文件指针;*/fp=fopen(“letter.dat”,“w”);/*新建并打开一个磁盘文件letter.dat;*/if(fp==NULL)/*判断文件打开成功与否*/{printf(\nOpeningfileerror);exit(0);}for(ch='A';ch='Z';ch++)fputc(ch,fp);/*将存储在变量ch中的字符写入文件*/fputc('\n',fp);/*最后写入一个换行符*/fclose(fp);/*关闭文件;*/}使用文件的通用步骤1。使用文件的通用步骤4。使用文件的通用步骤3。使用文件的通用步骤2。三、文件的打开1.fopen函数格式:fopen(文件名,文件使用方式);fopen函数有返回值,返回值是一个地址,即被打开文件的“文件信息区”的起始地址,使用时应将返回值赋给一个文件指针变量需要打开的文件名使用文件的方式(读或写)让哪个指针变量指向被打开的文件例FILE*fp;fp=fopen(“file1”,“r”);2.文件使用方式(1)“r”与“rb”只读以此方式打开文件时,该文件必须已经存在,如不存在将出错.打开文件后只能从文件中读数据,当前读写位置设定于文件开头.(2)“w”与“wb”只写以此方式打开文件时,如有同名文件(即文件已存在),则将原有文件删除并建立一个新文件;如没有同名文件(即文件不存在),则建立一个新文件.打开文件后只能向文件中写数据,当前读写位置设定于文件开头.(3)“a”与“ab”追加以此方式打开文件时,如有同名文件,则将当前读写位置设定于文件末尾,可以追加数据;如无同名文件,则建立一个新文件(4)带“+”号的形式:表示即能读又能写3.对文件打开成功与否的判断打开文件时,因使用方式不对或其他原因,可能会使打开文件的操作失败,这时fopen函数的返回值是NULL,所以在打开文件时通常我们会做一个判断,看打开操作是否成功.例if((fp=fopen(“file1”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}说明:exit函数的作用是关闭所有文件,结束程序,并返回操作系统,也可写成exit();注意:使用exit函数要包含头文件stdlib.h四、文件的关闭1.fclose函数格式:fclose(文件指针变量);例:fclose(fp);作用:将文件指针变量所指向的文件关闭,即使文件指针变量不再指向该文件,以后不能通过文件指针变量对该文件进行操作说明:fclose函数的返回值为整型,若关闭成功返回值为0,若失败返回值为非零数2.关闭文件的重要性写文件时,在“输出缓冲区”装满后,才将数据一起写入文件.当程序结束时,缓冲区可能还未满,如未关闭文件就结束程序,则缓冲区的数据不能写入文件,会丢失数据.使用fclose函数,不论缓冲区是否已满,都会将缓冲区的数据写入文件,再关闭文件.2.fgetc函数形式:字符变量=fgetc(文件指针变量);例:FILE*fp;charch;if((fp=fopen(“file1”,“r”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}ch=fgetc(fp);printf(“%c”,ch);注意:EOF实际是一个符号常量,其值为–1一般用EOF作字符文件的文件结束符,当用fgetc函数时,如果遇到文件结束也将返回EOF1.fputc函数(向文件输出一个字符)(略)一、输入/输出一个字符1.fgets函数格式:fgets(str,n,fp);说明:str--字符数组名,n--整数值,fp--文件指针变量作用:从fp所指向的文件中读(n-1)个字符,将它们存放到str数组中,并在其后自动加一个‘\0’,如果读入(n-1)个字符前遇到换行符或文件结束符EOF,则结束读入函数返回值:成功返回str数组的首地址,失败返回NULL2.fputs函数格式:fputs(str,fp);说明:str--字符串常量或字符数组名或字符指针变量fp--文件指针变量作用:将str字符串写到fp所指向的文件中,但‘\0’不写入文件函数返回值:成功返回0,出错返回非0值二、输入/输出一个字符串三、按“数据块”的方式输入输出(1).格式:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);作用:对fp指向的文件读/写count个大小为size的数据项(2).说明(1)buffer:是一个地址对fread而言buffer是从文件中读取的数据要存放的存储区的首地址对fwrite,buffer是向文件中写入数据时存储变量的地址(2)size:要读写数据所占用的字节数(3)count:要读写数据项的个数(4)fp:文件指针变量注意:用fread,fwrite必须采用二进制方式打开文件例:从键盘输入10个整数,把它们保存到文件“datafile”中,再从文件中读取这些整数,并输出到显示器上#includestdio.h#includestdlib.hvoidmain(){FILE*fp;intm,n,j;if((fp=fopen(“datafile”,“wb+”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}for(j=0;j10;j++){scanf(“%d”,&m);fwrite(&m,2,1,fp);}rewind(fp);for(j=0;j10;j++){fread(&n,2,1,fp);printf(“%4d”,n);}fclose(fp);}四、格式化输入输出函数fprintf(文件指针变量,格式字符串,输出表列);fscanf(文件指针变量,格式字符串,输入表列);例:#includestdio.h#includestdlib.hvoidmain(){FILE*fp;inta,b,c,d;if((fp=fopen(“exfile”,“wb+”))==NULL){printf(“Cannotopenthisfile!\n”);exit(0);}scanf(“%d%d”,&a,&b);fprintf(fp,“%d,%d\n”,a,b);rewind(fp);fscanf(fp,“%d,%d”,&c,&d);printf(“%d,%d\n”,c,d);fclose(fp);}一、文件定位函数fseek格式:fseek(文件指针变量,位移量,起始点);函数返回值:成功返回0,出错返回非0值是一个longint型数据,表示以“起始点”为基点向前或向后要移动的字节数表示从什么位置为基准移动,用数字代表SEEK_SET(0)--文件开始处SEEK_CUR(1)--文件位置指针的当前指向SEEK_END(2)--文件末尾处1.rewind函数(无返回值)格式:rewind(文件指针变量);作用:将文件位置指针重新返回到文件开头2.ftell函数格式:长整型变量=ftell(文件指针变量);作用:得到文件中位置指针的当前指向,这个位置是相对于文件开头的位移量二、其他函数例:输入学生信息,保存在文件中,再从文件中读取学生信息输出到显示器上#includestdio.h#includestdlib.h#defineSIZE4structstud{charname[10];intnum;intscore;}st[SIZE];longlen=sizeof(structstud);voidmain(){FILE*fp;inti;structstudx;for(i=0;iSIZE;i++)scanf(“%s%d%d”,st[i].name,&st[i].num,&st[i].score);save();fp=fopen(“studata”,“rb”);for(i=0;iSIZE;i++){fread(&x,len,1,fp);printf(“%-10s%4d%4d\n”,x.name,x.num,x.score);}fseek(fp,-2*len,2);fread(&x,len,1,fp);printf(“%-10s%4d%4d\n”,x.name,x.num,x.score);fclose(fp);}voidsave(){FILE*fp;inti;if((fp=fopen(“studata”,“wb”))==NULL){printf(“cannotopenthisfile!\n”);exit(0);}for(i=0;iSIZE;i++)if(fwrite(&st[i],len,1,fp)!=1)printf(“filewriteerror!\n”);fclose(fp);}1、文件类型指针小结2、文件的打开(fopen())与关闭(fclose())函数4、文件的其他操作函数3、文件的读写分类函数1、本次考试的形式采用笔试的形式。2、时间待定。3、考试范围:不考的内容:第3章:函数递归调用、返回指针值的函数、函数的指针第4章:指向多维数组的指针、多维数组与指针第5章:链表。第6章:文件只考基本的概念和基本函数。4、出题:题型为选择、填空、程序填空、编程。考试相关
本文标题:第6章 磁盘数据存储
链接地址:https://www.777doc.com/doc-4147302 .html