您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C程序设计教程(第二版式)1-7
第7章文件7.1C文件概述7.1.1问题的提出我们之前写的程序,其运行结果是显示在屏幕上,一旦程序运行结束,这些数据都会被计算机“忘记”,如果此时需要对这些数据做一些新的处理,例如排序、查询等,必须再将这些数据从键盘输入一遍??7.1.2文件“流”C语言把文件看作数据流。字节的序列。字节流或二进制流。ASCII文件与二进制文件。文件的存取单位:字节。流式文件:把文件中的数据看成由字节组成的数据流,而不认为文件是由记录构成的。7.1.3文件操作的特点在C语言中,所有对文件的操作都依赖一种特殊的指针:文件指针。打开文件是使文件指针与磁盘文件建立联系,建立了联系以后,才能对它进行读/写等操作;关闭文件是断开指针与文件之间的联系,禁止再对该文件进行操作。7.1.3文件操作的特点文件操作程序的编写分下面几步:第一步:定义文件指针;第二步:打开文件,并判断是否成功打开,若打开文件失败,程序退出运行状态;第三步:对文件进行读写等操作;第四步:关闭文件。7.1.4缓冲文件系统缓冲文件系统:系统自动为文件开辟存放文件的缓冲区,用于存放文件的数据。缓冲区大小一般为512字节,是与外存进行数据交换的数据单位。又称高级(高层)输入输出系统。非缓冲文件系统:系统自动不提供缓冲区,需要编写程序设定缓冲区。又称低级(低层)输入输出系统。书上图示。7.2.1文件类型指针要想对文件进行操作,首先必须为不同的文件定义不同的文件指针,然后通过这些指针操作文件。定义方式FILE*fp;实际上,FILE是一种结构类型,用来描述文件有关信息。定义了文件指针以后,意味着:开辟一个FILE结构的空间,用指针fp指向它。7.2文件的打开与关闭7.2.2文件的打开C语言的文件操作都用函数实现。fopen()函数用来打开文件。fp=fopen(文件名,使用文件方式);fp为已定义的文件指针。例:FILE*fp;fp=fopen(“A”,”r”);fp指向要操作的文件。fp与A文件具有对应的关系。打开文件需要的信息:1、打开哪个文件2、打开文件的方式3、使用哪个文件指针打开文件的文件名是字符串常量或变量。使用文件方式一般也要带双引号。fopen返回一个指针,应该不为空,为空表示文件打开失败。正确打开文件的方式:if((fp=fopen(“A”,”r”))==NULL){printf(“cannotopenthisfile\n”);exit(0);}else{文件处理;}文件的使用方式:书上7.2.3文件的关闭文件操作结束以后,需要释放文件指针,使文件指针与文件“脱钩”,关闭以后,不能再对该文件进行操作。fclose函数fclose(文件指针)例如:fclose(fp);文件操作的顺序:打开——》处理——》关闭保证文件操作的正常执行。与缓冲区有关。7.3.1fputc函数与fgetc函数1、写一个字符到文件中的函数fputc调用方法:fputc(ch,fp)功能:将ch的内容输出到fp所指的文件中,ch是单个字符。#defineputchar(c)fputc(c,stdout)2、fgetc()调用方法:fgetc(fp)功能:从fp所指的文件中读单个字符作为返回值。7.3文件的读写操作fputc函数的返回值可以是要写到文件中的字符的ASCII值,或是返回值EOF(-1),前者表示写操作是成功的,后者则表示写操作失败。文件内部位置指针,用于指定文件当前读写的位置。注意,文件内部位置指针不是用FILE类型定义的指针,文件内部位置指针不需在程序中定义和使用,而是由系统自动设置的。文件内部位置指针所指的位置是每一次读写操作的开始位置,而每一次读写操作以后,系统会使文件内部位置指针自动移动到下一次开始的位置,例7.1将“Thank”写入文件first.dat中。#includestdio.h#includeprocess.hvoidmain(){FILE*fp;charc;if((fp=fopen(first.dat,w))==NULL)/*以写方式打开ASCII文件first.dat*/{printf(cannotopenthisfile\n);/*打开失败则退出运行*/exit(1);}else{fputc('T',fp);/*写操作*/fputc('h',fp);fputc('a',fp);fputc('n',fp);fputc('k',fp);fclose(fp);/*关闭文件*/}}例7.2在例7.1生成的文件first.dat中追加内容“you”。#includestdio.h#includeprocess.hvoidmain(){FILE*fp;char*p;if((fp=fopen(first.dat,a))==NULL)/*以追加方式打开ASCII文件first.dat*/{printf(cannotopenthisfile\n);/*打开失败则退出运行*/exit(1);}else{fputc('',fp);/*写操作*/fputc('y',fp);fputc('o',fp);fputc('u',fp);fclose(fp);/*关闭文件*/}}例7.4将例7.1中建立的文件Second.dat的内容在屏幕上显示。#includestdio.h#includeprocess.hvoidmain(){FILE*fp;charc;if((fp=fopen(Second.dat,r))==NULL)/*打开文件Second..dat*/{printf(cannotopenthisfile\n);/*打开失败则退出运行*/exit(1);}else{for(c=fgetc(fp);c!=EOF;c=fgetc(fp))/*连续从文件中读字符到内存变量c中*/putchar(c);/*在屏幕上显示c*/printf(Sucessoperation!);fclose(fp);/*关闭文件*/}}7.4.2fprintf函数与fscanf函数与printfscanf的使用格式很相似。fprintf(文件指针,格式字符串,输出表列);fscanf(文件指针,格式字符串,输入表列);例7.6编写程序创建文件four.dat,将浮点数5.8和7.0写入该文件。#includestdio.h#includeprocess.hvoidmain(){FILE*fp;/*定义文件指针*/if((fp=fopen(d:\\Four.dat,w))!=NULL)/*打开文件Four.dat*/{printf(Sucessoperation!);fprintf(fp,%f%f\n,5.8,7.0);/*将两个浮点数写入文件Four.dat中*/}else{printf(\ncannotopenfile\n);exit(1);}fclose(fp);/*关闭文件*/}例7.7编写程序将上例存储在文件Four.dat中的两个浮点数显示在屏幕上。#includestdio.h#includeprocess.hvoidmain(){FILE*fp;/*定义文件指针*/floatx,y;if((fp=fopen(c:\\Four.dat,r))!=NULL)/*打开文件Four.dat*/{fscanf(fp,%f%f,&x,&y);/*从文件中读入两个浮点数*/printf(%f%f\n,x,y);/*在显示器上显示这两个浮点数*/}else{printf(\ncannotopenfile\n);exit(1);}fclose(fp);}7.4.3fread函数与fwrite函数数据块的读入和写出。顺序文件。fread(datapointer,size,count,fp)fwrite(datapointer,size,count,fp)其中,datapointer是读写存取数据的地址。读入数据时,把要读入的数据存放在它指定的区域。输出数据时,从该地址指定的区域开始输出。size*count读写的总字节数。fp文件指针。count正确调用后的返回值例7.10输出10个浮点数到文件c:\Five.dat中。#includestdio.h#includeprocess.hvoidmain(){floata[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.1};/*初始化数组a*//*在数组a中存放10个浮点数*/FILE*f;if((f=fopen(d:\\Five.dat,wb))==NULL)exit(0);elseif(fwrite(a,sizeof(float),10,f)!=10)/*将数组a中存放10个浮点数写入文件*/printf(filewriteerror\n);printf(Succeed!\n);fclose(f);}例7.11在屏幕上显示c:\Five.dat文件中存储的十个浮点数。#includestdio.h#includeprocess.hvoidmain(){floatb[10];/*准备数组b*/FILE*f;inti;if((f=fopen(d:\\Five.dat,rb))==NULL)/*打开文件*/exit(0);elseif(fread(b,sizeof(float),10,f)!=10)/*将文件中的10个浮点数读入b中*/printf(filereaderror\n);for(i=0;i=9;i++)printf(%6.2f,b[i]);fclose(f);}7.4文件的定位操作7.4.1文件的顺序存取和随机存取顺序存取的特点是对文件的读写方式都是从文件的开始到文件的结束,读/写了第一个字节,才能读/写第二个字节,依次类推,如果想读/写文件的最后一个字节,必须先读写完该字节前面的所有字节。随机存取的特点是允许从文件的任何位置开始读写操作,文件操作的位置可以由程序控制。7.4.2rewind函数格式:rewind(fp);功能:文件的位置指针重新返回文件的开头。例7.14编写程序使用字符串写函数将字符串“Welcomeyou”写入ASCII文件file_we.txt中,并使用重绕回到文件首部,再使用字符串读函数将刚写入文件的字符串读入内存并显示在屏幕上。#includestdio.h#includeprocess.hvoidmain(){charstring[]=welcomeyou;chardisplay[15];FILE*fp;charc;if((fp=fopen(file_we.txt,w+))==NULL)/*打开文件*/{printf(cannotopenthisfile\n);exit(1);}else{fputs(string,fp);/*写字符串到文件中*/rewind(fp);/*重绕*/fgets(display,15,fp);/*读入到内存*/puts(display);/*输出到屏幕上*/fclose(fp);}}7.4.3fseek函数功能:移动文件的位置指针。格式:fseek(fp,位移量,起始点);0:文件开始1:当前位置2:文件末尾位移量:从起始点开始移动的字节数。整数向前移动;负数向后移动。
本文标题:C程序设计教程(第二版式)1-7
链接地址:https://www.777doc.com/doc-3354819 .html