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

付费下载

下载本文档

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

文档简介

12文件第章如前所述,程序中数据的输入可通过scanf()、getchar()等函数经由键盘进行读入,但当数据量较大时,用户工作量将会很大,而且每次运行时都需要重复输入工作。此外,程序的运行结果可通过printf()、putchar()等函数直接输出到屏幕上,但程序每次运行完毕后,程序运行结果就会被“清空”。因此,如果将数据保存在文件中,每次程序运行时对文件进行读取,并且将程序运行结果保存在另一个文件中,这样可大大减轻工作量,也可长期保存数据。本章首先介绍了文件的概念,然后介绍了文件的打开、关闭等基本操作,接着重点介绍了文件的读写和定位方式,最后给出了两个实例,让读者进一步掌握文件在程序设计中的应用。学习目标理解文件及文件类型指针的概念理解文件操作的顺序掌握文件打开函数和文件关闭函数的使用方法掌握文件读写函数和文件定位函数的使用方法掌握编写简单的文件读写程序的方法文件概述文件基本操作文件读写文件定位应用举例目录CONTENTS12.112.212.312.412.5常见错误分析14.6PART12.1文件概述12.1文件概述文件指存储在外部介质(如磁盘等)上有序的数据集合,这个数据集有一个名称,称为文件名。例如,程序所生成的源文件(.c文件)、编译后生成的目标文件(.obj文件),链接后生成的可执行文件(.exe文件)等。在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如,通常把显示器称为标准输出文件,printf就是向这个文件输出数据;把键盘称为标准输入文件,scanf就是从这个文件获取数据。虽然文件在计算机中皆是用二进制0、1来表达与存储,但根据数据的组织形式不同,文件可分为ASCII文件和二进制文件。12.1文件概述ASCII文件:也称为文本文件。文件在磁盘中每个字节存放的是对应字符的ASCII码。例如,对数值5678存储为对应字符5、6、7、8的ASCII码,共占用4个字节,存储形式如图所示。ASCII文件可在屏幕上按字符显示,方便阅读,例如,源程序文件、头文件便是ASCII文件。二进制文件:文件在磁盘中存放的是对应数值的二进制形式。例如,数值5678存储为二进制形式时,内容为0001011000101110,只占了2个字节。二进制文件的优点在于节省存储空间,但可读性较差。C系统在处理文件时,并不区分类型,文件都是被看作一个字节序列,即由一连串的字符组成,称为“流(stream)”,并以字节为单位进行访问,没有记录的界限。输入输出字符流的开始和结束只由程序进行控制而不受物理符号(如回车符)的控制。因此,这种文件称作“流式文件”,将数据从磁盘文件流向内存的过程称为“输入”,反之,将数据从内存流向磁盘文件的过程称为“输出”。PART12.2文件基本操作C语言中,对文件的所有操作都是通过文件类型指针来进行的。除了标准的输入、输出文件外,其他所有的文件都必须先打开再使用,而且使用后也必须关闭该文件。12.2文件基本操作在操作文件时,我们需要知道文件的文件名、文件状态等信息。ANSIC为每个被使用的文件在内存中都分配了一块区域,利用一个结构体类型变量存储上述信息。该结构体类型是由系统声明的,取名为FILE,包含在“stdio.h”头文件中。FILE结构体类型的形式大致如下:typedefstruct{ shortlevel; /*缓冲区满空的程度*/ unsignedintflags; /*文件状态标志*/ charfd; /*文件描述符*/ unsignedcharhold; /*如缓冲区无内容不读取字符*/ shortbsize; /*缓冲区的大小*/ unsignedchar*buffer; /*数据缓冲区首地址*/ unsignedchar*curp; /*指针当前位置(下一个待处理字节地址)*/ unsignedintistemp; /*临时文件指示*/ shorttoken; /*有效性标记*/}FILE;12.2.1文件类型指针12.2文件基本操作12.2.1文件类型指针

提示不同C编译系统的FILE类型包含的内容可能不完全相同,但大同小异。对以上结构体中的成员及其含义不必深究,只须知道其中存放文件的相关信息即可。声明FILE结构体类型的信息包含在头文件“stdio.h”中,在程序中可以直接定义指向FILE类型变量的指针变量,其定义的一般形式为:FILE*指针变量标识符;一般习惯写成:FILE*fp;定义fp是一个指向FILE类型数据的指针变量。可以使fp指向某一个文件的文件信息区,通过该文件信息区中信息就能够访问该文件。12.2文件基本操作12.2.2文件打开——fopen函数ANSIC规定了用标准输入输出函数fopen来打开文件。fopen函数原型为:FILE*fopen(constchar*filename,constchar*mode);调用fopen函数的方式为:fopen("文件名","文件操作方式表示符");fopen函数的返回值是指向文件的指针(即文件信息区的起始地址),通常将fopen函数的返回值赋给一个指向文件的指针变量。例如:FILE*fp; /*定义一个指向文件的指针变量fp*/fp=fopen("myfile","r"); /*以只读方式打开myfile文件并将返回值赋给指针变量fp*/12.2文件基本操作12.2.2文件打开——fopen函数含义为以只读的方式打开文件myfile。调用函数时,系统会在缓冲区为文件开辟一个文件信息描述区,并将该文件信息描述区(文件结构体变量)的地址赋给指针fp,然后通过fp便可以实现对文件的各种操作。如果文件打开失败,则fopen返回空指针NULL。

名师点睛文件名亦可包含文件路径,写路径时注意斜杠问题。若路径和文件名为“c:\documents\myfile”,应写成“c:\\documents\\myfile”。例如:fp=fopen("c:\\documents\\myfile","w");12.2文件基本操作12.2.2文件打开——fopen函数文件操作方式表示符的内容及含义如表所示。文件使用方式含义如果指定的文件不存在“r”(只读)打开一个文本文件,只允许读数据出错“w”(只写)打开或建立一个文本文件,只允许写数据建立新文件“a”(追加)打开一个文本文件,并在文件末尾增加数据出错“rb”(只读)打开一个二进制文件,只允许读数据出错“wb”(只写)打开或建立一个二进制文件,只允许写数据建立新文件“ab”(追加)打开一个二进制文件,并在文件末尾写数据出错“r+”(读写)打开一个文本文件,允许读和写出错“w+”(读写)打开或建立一个文本文件,允许读写建立新文件12.2文件基本操作12.2.2文件打开——fopen函数文件使用方式含义如果指定的文件不存在“a+”(读写)打开一个文本文件,允许读或在文件末追加数据出错“rb+”(读写)打开一个二进制文件,允许读和写出错“wb+”(读写)打开或建立一个二进制文件,允许读和写建立新文件“ab+”(读写)打开一个二进制文件,允许读或在文件末追加数据出错1用只读方式“r”打开文件时,该文件必须已经存在,否则出错,且只能进行读取操作。2用只写方式“w”打开文件时,如文件不存在,则以指定的文件名新建文件。若打开的文件已经存在,则原文件内容消失,重新写入内容且只能进行写操作。12.2文件基本操作12.2.2文件打开——fopen函数3用追加方式“a”打开文件时,若文件不存在则出错,若文件存在则向文件末尾追加新的信息。4如一个文件无法打开,或者打开出错,将无法正确进行读写操作。因此,在打开文件时须判断打开文件是否出错,可用下列语句来判别是否打开成功:if((fp=fopen("myfile","r"))==NULL){ printf("cannotopenthisfile\n"); exit(0);}即打开的同时判断是否打开成功,如打开失败则显示提示信息,exit函数的作用是关闭所有文件,终止正在执行的程序,待用户检查出错误,修改后重新运行。12.2文件基本操作12.2.2文件打开——fopen函数

名师点睛exit是标准C的库函数,作用是使程序终止,用此函数时需要在程序的开头包含“stdlib.h”头文件。5“r+”、“w+”、“a+”都是既可读亦可写,区别在于“r+”与“r”一样文件必须已经存在,“w+”和“w”一样,如文件不存在则新建文件,写后可以读;“a+”则是打开文件后可以在文件末尾增加新数据亦可以读取文件。6打开方式带上“b”表示是对二进制文件进行操作。文本文件读入内存时,需将ASCII码转换成二进制码,写入磁盘时,再把二进制码转换成ASCII码,因此,相比文本文件,二进制文件的读写需要多花费一些转换时间。12.2文件基本操作12.2.3文件关闭——fclose函数使用完一个文件后,如不关闭文件,文件读写的数据可能丢失。因为文件的操作是通过缓冲区进行的,读写数据先放入缓冲区,当缓冲区满时方写入文件,如果操作后缓冲区未满,又未关闭文件,则缓冲区中的数据将会丢失,因此,必须使用文件关闭命令,将缓冲区的数据写入文件。文件关闭函数fclose原型为:intfclose(FILE*fpoint);fclose函数调用的一般形式为:fclose(fp);fp为前面定义过的文件指针。当关闭成功,返回0,否则返回EOF(-1)。可通过fclose函数的返回值判断文件是否正常关闭。if((fp=fclose(fp))!=0) printf("\nerror:failinfileclose!");文件关闭不仅可以保存数据,而且可释放文件结构体变量所占存储空间,节省系统资源。PART12.3文件读写12.3文件读写文件打开之后,可以对它进行读写操作了。C语言提供了多种文件读写函数,都包含在头文件“stdio.h”中,主要有以下几种:(1)字符读写——fgetc和fputc函数。(2)字符串读写——fgets和fputs函数。(3)格式化读写——fscanf和fprintf函数。(4)数据块读写——fread和fwrite函数。

提示对于所有读函数,文件都必须以读或读写方式打开;对于所有写函数,文件都必须以写、读写或追加方式打开;如希望重建文件,可采用只写或读写方式打开文件;如希望保留原文件内容,从后面开始增加新内容,可采用追加或追加式读写方式打开文件。12.3文件读写12.3.1字符读写——fgetc和fputc函数fgetc函数的功能是从指定的文件中读一个字符,其函数原型为:intfgetc(FILE*fpoint);函数调用的一般形式为:字符变量=fgetc(文件指针);例如:c=fgetc(fp);函数每次从文件中读取一个字符,返回值为该字符的ASCII码。如果返回值为EOF,则表示已至文件结束位置(文件结束标志为EOF)。112.3文件读写12.3.1字符读写——fgetc和fputc函数编写程序,打开当前目录下名为“12-1.txt”的文件,读取文件内容并将其输出到屏幕上。首先用fopen函数以只读方式打开“12-1.txt”文件,然后用fgetc函数从文件中逐个读取字符并输出到屏幕上即可。12.3文件读写12.3.1字符读写——fgetc和fputc函数#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp; charch; if((fp=fopen("12-1.txt","r"))==NULL) /*若打开文件失败*/ { printf("cannotopenthisfile\n"); exit(0); /*退出程序*/ }

12.3文件读写12.3.1字符读写——fgetc和fputc函数ch=fgetc(fp); /*读取第1个字符*/while(ch!=EOF) /*判断是否到文件结束位置*/{ putchar(ch); /*输出字符到终端*/ ch=fgetc(fp); /*继续读取字符*/}fclose(fp); /*关闭文件*/printf("\n");return0;}12.3文件读写12.3.1字符读写——fgetc和fputc函数程序运行结果如左图所示,文件内容如右图所示。打开文件后,fgetc读取的是第一个字符,再调用fgetc,则依次读取下一个字符。如读至文件结束位置,则返回EOF。实际上,读写位置是由文件内部位置指针控制的,文件打开时,位置指针指向第一个字节,并随函数的调用后移,该位置指针由系统自动设置,无需用户定义。fputc()函数的功能是将一个字符输出到文件中,其函数原型为:intfputc(intc,FILE*fpoint);函数调用的一般形式为:fputc(字符量,文件指针fp);字符量可以是字符常量或字符变量,例如:charc='a';fputc(c,fp);等同于fputc('a',fp);函数每次依次向文件写入一个字符,写入成功则返回字符的ASCII码,写入失败则返回EOF。212.3文件读写12.3.1字符读写——fgetc和fputc函数12.3文件读写12.3.1字符读写——fgetc和fputc函数编写程序实现从键盘输入一行字符,将其输出到D盘根目录的myfile.txt文件中。首先用fopen函数以只写的方式打开“d:\myfile.txt”文件,然后从键盘输入字符串到一个字符数组中,最后将字符数组中的字符逐个写入到文件中。12.3文件读写12.3.1字符读写——fgetc和fputc函数#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp; charch[1001],*p=ch; /*字符个数不超过1000个*/ if((fp=fopen("d:\\myfile.txt","w"))==NULL) /*若打开文件失败*/ { printf("cannotopenthisfile\n"); exit(0); /*退出程序*/ }12.3文件读写12.3.1字符读写——fgetc和fputc函数 printf("请输入一个字符串:"); gets(p); /*输入字符串*/ while(*p!='\0') /*逐个字符输出到文件*/ { fputc(*p,fp); p++; /*指针指向下一个字符*/ } fclose(fp); /*关闭文件*/ return0;}12.3文件读写12.3.1字符读写——fgetc和fputc函数程序运行结果如左图所示,文件内容如右图所示。12.3文件读写12.3.2字符串读写——fgets和fputs函数函数原型为:char*fgets(char*s,intn,FILE*fpoint);函数调用的一般形式为:fgets(字符数组名,n,文件指针);fgets函数的功能是从指定的文件中读一个长度为n-1的字符串,在末尾加上字符串结束标志'\0'后,送入一个字符数组中。如读取成功,返回字符数组的首地址,否则返回NULL。例如:charstr[20]; /*等同于char*str;*/intn=9;fgets(str,n,fp); /*读取n-1个字符给字符数组str*/112.3文件读写12.3.2字符串读写——fgets和fputs函数函数原型为:intfputs(char*string,FILE*fpoint);函数调用的一般形式为:fputs(字符串,文件指针);fputs函数的功能是向文件中写入一个字符串,其中字符串可以是字符串常量,亦可以是有赋值的字符数组。例如:fputs("china",fp);fputs(str,fp);212.3文件读写读出例12-2中的文件“d:\myfile.txt”前4个字符并显示,然后输入一段字符串,重写该文件,再将文件中前8个字符读出显示在屏幕上。(1)以读写方式打开文件。(2)用fgets函数读取文件的前4个字符到字符数组中,并将该字符数组输出到屏幕。(3)从键盘输入字符串到字符数组中,然后用fputs函数将字符串写入到文件中。(4)用fgets函数读取文件的前8个字符到字符数组中,并将该字符数组输出到屏幕。12.3.2字符串读写——fgets和fputs函数为解决问题,可分为4个步骤:

提示每次读取或写入文件前,需要用rewind函数将fp所指文件的内部指针移至文件开头处,rewind函数将在12.4节介绍。12.3文件读写#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp; /*定义文件描述符指针fp*/ charstr[15]; /*定义字符数组*/ if((fp=fopen("d:\\myfile.txt","r+"))==NULL) /*判断文件是否打开成功*/ { printf("cannotopenthisfile\n"); /*显示文件打开失败信息*/ exit(0); /*退出程序*/ }12.3.2字符串读写——fgets和fputs函数12.3文件读写 fgets(str,5,fp); /*从fp指向的文件中读取一个长度为4(5-1=4)的字符串存入str*/ puts(str); /*输出字符串*/ printf("Pleaseinputlessthan14words:\n"); /*提示语*/ gets(str); /*输入字符串*/ rewind(fp); /*rewind函数将fp所指文件的内部指针移至文件头*/ fputs(str,fp); /*将str字符串写入到文件中*/ rewind(fp); /*rewind函数将fp所指文件的内部指针移至文件头*/ fgets(str,9,fp); /*从fp指向的文件读取一个长度为8的字符串存入str*/ puts(str); /*输出字符串*/ fclose(fp); /*关闭文件*/ return0;}12.3.2字符串读写——fgets和fputs函数12.3文件读写程序运行结果如左图所示,文件内容如右图所示。“fgets(字符数组名,n,文件指针);”的功能是从文件指针所指文件中读一个长度为n-1的字符串,因此,程序中读出8个字符的函数调用形式为“fgets(str,9,fp);”。12.3.2字符串读写——fgets和fputs函数12.3文件读写12.3.3格式化读写——fscanf和fprintf函数fscanf函数与scanf函数功能类似,区别在于scanf函数从标准输入文件即键盘读入,而fscanf函数则是从文件中读入。其函数原型为:intfscanf(FILE*fpoint,char*format,[argument...]);函数调用的一般形式为:fscanf(文件指针,格式控制字符串,输入项列表);例如:fscanf(fp,"%c%d",&c,&a);112.3文件读写12.3.3格式化读写——fscanf和fprintf函数fprintf函数与printf函数功能类似,区别在于printf函数输出到标准输出文件即显示器上,而fprintf函数则是输出到文件中。其函数原型为:intfprintf(FILE*fpoint,char*format,[argument...]);函数调用的一般形式为:fprintf(文件指针,格式控制字符串,输出项列表);例如:fprintf(fp,"%c%d",c,a);212.3文件读写12.3.3格式化读写——fscanf和fprintf函数读取文本文件“12-4.txt”中的数据,求出这些数据的平均值,并将平均值追加到原始数据后面,文件“12-4.txt”中的数据如图所示。(1)首先定义一个一维数组用于存放从文件中读取的数据,然后读取文件中的数字赋给数组元素。(2)计算这些数组元素的平均值。(3)将平均值追加到原始数据后面。为解决问题,可分为3个步骤:12.3文件读写12.3.3格式化读写——fscanf和fprintf函数#include<stdio.h>#include<stdlib.h>#defineN6voidread_data(inta[],intn) /*从文件读数据函数*/{ inti; FILE*fp; if((fp=fopen("12-4.txt","r"))==NULL) /*打开文件失败*/ { printf("文件读取失败!"); exit(0); /*退出程序*/ } for(i=0;i<n;i++) fscanf(fp,"%3d",&a[i]); /*格式化读取文件数据*/ fclose(fp);}floatAve(inta[]) /*计算平均值*/{12.3文件读写12.3.3格式化读写——fscanf和fprintf函数 inti; floatave=0.0; for(i=0;i<N;i++) { ave+=a[i]; } printf("计算成功!请打开文件查看!\n"); returnave/6;}voidwrite_data(inta[],floatave) /*写数据函数*/{ FILE*fp; if((fp=fopen("12-4.txt","a"))==NULL) /*打开文件失败*/ { printf("文件读取失败!"); exit(0); /*退出程序*/ } fprintf(fp,"\n\n这些数的平均值为:"); /*输出2行空行*/ fprintf(fp,"%4.2f",ave); /*输出平均值ave,保留2位小数*/ fclose(fp);}12.3文件读写12.3.3格式化读写——fscanf和fprintf函数intmain(){ inta[N]; floatave; read_data(a,N); /*读取文件*/ ave=Ave(a); /*计算平均值*/ write_data(a,ave); /*把平均值回写文件中*/ return0;}12.3文件读写12.3.3格式化读写——fscanf和fprintf函数程序运行结果如左图所示,文件内容如右图所示。12.3文件读写12.3.4数据块读写——fread和fwrite函数在对二进制文件进行读写时,通常使用数据块的读写函数fread()和fwrite(),可以一次读入一组数据,例如,一个数组、一个结构体变量的值等。函数调用的一般形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);其中buffer为输入或输出数据首地址,为指针变量;size为数据块长度(字节数);count表示要读写的数据块的个数;fp为文件指针。例如:charstr[20];fread(str,3,5,fp);即从fp所指文件中每次读3个字节,读5次,送至数组str中。fread及fwrite的返回值都是整型,如该整数和count相等,则表示读写成功,否则表示读写不正确。12.3文件读写输入3个日期(年月日),写入文件“12-5.dat”中,再从文件中读出并显示。定义一个有3个元素的结构体数组,用于存放3个日期。然后从键盘输入数据,用fwrite函数将数据输入到文件,再用fread函数将数据从文件中读取出来后输出到屏幕上。12.3.4数据块读写——fread和fwrite函数12.3文件读写#include<stdio.h>#include<stdlib.h>structdate /*定义结构体类型date*/{ intday; /*定义成员day*/ intmonth; /*定义成员month*/ intyear; /*定义成员year*/};intmain(){ FILE*fp; /*定义文件描述符指针fp*/ structdatedate1[3],date2[3]; /*定义结构体变量*/ inti; /*定义循环变量*/ if((fp=fopen(“12-5.dat”,“w+”))==NULL) /*判断文件是否打开成功*/ {12.3.4数据块读写——fread和fwrite函数12.3文件读写 printf("文件读取失败!"); /*打印失败信息*/ exit(0); /*退出程序*/ } printf("请输入3个日期,年、月、日以空格隔开:\n"); for(i=0;i<3;i++) /*循环3次*/ scanf("%d%d%d",&date1[i].year,&date1[i].month,&date1[i].day); /*分别输入结构体变量date1的值*/ fwrite(date1,sizeof(structdate),3,fp); /*将date1的值写入文件中*/ rewind(fp); /*将文件内部指针移至文件头*/ fread(date2,sizeof(structdate),3,fp); /*将文件中的3个日期读出赋给date2*/ printf("12-5.dat文件中的数据为:\n"); for(i=0;i<3;i++) /*循环3次*/ printf("%d%d%d\n",date2[i].year,date2[i].month,date2[i].day); /*输出date2的每个值*/ fclose(fp); /*关闭文件*/ return0;}12.3.4数据块读写——fread和fwrite函数12.3文件读写程序运行结果如图所示。12.3.4数据块读写——fread和fwrite函数PART12.4文件定位所谓文件位置指针,是系统设置的用来指向文件当前读写位置的指针,不需用户定义,但会随着文件的读写操作而移动,因此,在对文件进行操作前,需先清楚当前文件位置指针的位置,在不同位置进行操作时,也需将文件位置指针定位在相应位置。在C语言中,可以使用文件定位函数将文件位置指针定位在所要读写的任意位置,这些函数皆包含在头文件“stdio.h”中。12.4文件定位rewind函数的功能是将文件位置指针移至文件起始处,其函数原型为:voidrewind(FILE*fpoint);函数调用的一般形式为:rewind(fp); /*将文件读写位置指针移到文件的起始处*/112.4文件定位fseek用于将文件位置指针移到指定位置,其函数原型为:intfseek(FILE*fpoint,longoffset,intorigin);函数调用的一般形式为:fseek(fp,位移量,起始点);2“fp”是文件指针,指向被移动的文件。1“位移量”是移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错。当用常量表示位移量时,要求加后缀“L”。位移量为正,表示文件位置指针向文件尾方向移动;位移量为负,表示向文件头方向移动。212.4文件定位“起始点”为位移量的参考点,有三种取值:0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置”。C标准制定的名字如表所示。3起始点名字用数字代表文件开始位置SEEK_SET0文件当前位置SEEK_CUR1文件末尾位置SEEK_END2例如:fseek(fp,50L,0); /*以文件开头为基准,文件位置指针向文件尾方向移动50字节*/fseek(fp,-50L,2); /*以文件尾为基准,文件位置指针向文件头方向移动50字节*/12.4文件定位

提示fseek函数适用于二进制文件。文本文件因为需进行字符转换,计算字节时容易发生混乱,不利于定位。创建名为“12-6”的文件,输入“Thisisatest!”并存放进文件中,读取单词“test”并输出到终端。按“二进制读写”方式创建并打开指定的文件,文件名由终端输入。然后往文件中写入“Thisisatest!”字符串,接着利用fseek函数将文件位置指针指向“test”单词的字母“t”处,最后读取单词“test”并输出到终端。12.4文件定位#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp; charfilename[51],str[100]; /*filename存放文件名,str存放输入的字符串*/ printf("请输入文件名:"); scanf("%s",filename); /*输入文件名*/ if((fp=fopen(filename,"wb+"))==NULL) { /*按“二进制读写”方式创建并打开指定的文件*/12.4文件定位 printf("文件打开失败!\n"); exit(0); } printf("请输入一句话:\n"); getchar(); gets(str); /*从终端输入字符串*/ fputs(str,fp); /*将字符串输入到文件*/ fseek(fp,10L,0); /*移到从头开始的第10个字符处*/ fgets(str,5,fp); /*读取4个字符给str*/ puts(str); /*将str输出到终端*/ fclose(fp); /*关闭文件*/ return0;}12.4文件定位程序运行结果如图所示。12.4文件定位ftell函数用于寻找位置指针的当前位置。其函数原型为:longftell(FILE*fpoint);返回值为文件位置指针当前位置相对于文件开始的偏移字节数,如函数调用出错,则返回-1。函数调用的一般形式为:longn;n=ftell(fp);312.4文件定位feof用于判断文件位置指针是否在文件结束位置。其函数原型为:intfeof(FILE*fpoint);函数调用的一般形式为:feof(fp);当文件位置指针在文件末尾时,返回值为1,否则返回值为0。例如:if(feof(fp)==1) printf("It’stheendofthefile.\n");else printf("Itisn’ttheendofthefile.\n");4PART12.5应用举例下面再通过几个例子,让读者进一步学习文件的相关操作。12.5应用举例12.5.1文件内容复制将文件“file.txt”中的内容复制到另一个文件“copy.txt”中,并显示文件“copy.txt”的第一个字符。将文件“file.txt”复制到另一个文件“copy.txt”中,首先需要将两个文件打开,其中“file.txt”以只读形式打开,“copy.txt”文件以读写方式打开。然后读取“file.txt”文件中的字符并写入到“copy.txt”文件中。最后读取“copy.txt”文件的第一个字符并输出后关闭两个文件。12.5应用举例12.5.1文件内容复制#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp1,*fp2; /*定义文件描述符指针*/ charc; /*定义字符变量*/ if((fp1=fopen("file.txt","r"))==NULL) /*以只读方式打开文件“file.txt”*/ { printf("\nerror:failinopeningmyfile!"); exit(0); } if((fp2=fopen("copy.txt","w+"))==NULL) /*以读写方式打开文件“copy.txt”*/ {12.5应用举例12.5.1文件内容复制 printf("\nerror:failinopeningcyfile!"); exit(0); } while(!feof(fp1)) /*判断指针是否在文件结束位置*/ { c=fgetc(fp1); /*从文件读取一个字符*/ fputc(c,fp2); /*将字符写入到“copy.txt”文件中*/ } rewind(fp2); /*将fp2所指的文件的内部指针移至文件开始位置*/ c=fgetc(fp2); /*从文件读取一个字符*/ printf(“%c\n”,c); /*输出c的值*/ fclose(fp1); /*关闭文件“file.txt”*/ fclose(fp2); /*关闭文件“copy.txt”*/ return0;}12.5应用举例12.5.1文件内容复制程序运行结果如左图所示,“copy.txt”文件内容如右图所示。文件“copy.txt”必须以读写方式打开,如果以只写方式打开,就读不出文件的第一个字符了。12.5应用举例12.5.2将计算结果保存到文件有5个学生,每个学生的信息包括姓名和C语言成绩两项,具体数据如表所示。请计算出5个学生的平均成绩,并将原有数据与平均成绩都存放在磁盘文件“score.txt”中。姓名BeibeiJingjingHuanhuanYingyingNiniC语言成绩8578839268每个学生信息都包括两个部分,因此,需要用到结构体变量存放学生信息;然后新建并打开文件,将原始数据及计算的平均成绩存放入文件中;最后关闭文件。12.5应用举例12.5.2将计算结果保存到文件#include<stdio.h>#include<stdlib.h>#defineN5typedefstruct /*定义结构体类型*/{ charname[10]; /*定义成员名字*/

温馨提示

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

最新文档

评论

0/150

提交评论