版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章文件第8章文件“文件”是指存储在外部介质上的一组相关数据的数据流,这个数据流的名称被称为文件名。在C语言中,数据以字符的数字序列形式进行组织。根据数据的组织形式,文件可以分为文本文件和二进制文件。文本文件又称ASCII码文件,它把数据中的每个字符都转换为ASCII码值后进行存储,由磁盘向内存中加载数据时,需要进行反向转换。二进制文件把数据在内存中存储的形式原样存储到磁盘上。在C语言中,字符型数据全部以ASCII码形式存储,数值型数据既可以用ASCII码形式存储,也可以用二进制形式存储。本章涉及的案例与知识要点如图8-1所示。CONTENTS案例1:复制信息案例2:转存信息案例3:文件的定位案例4:文件检测案例1:复制信息案例1:复制信息输入信息到文件中,并将其显示在屏幕上。案例描述相关知识文件类型指针文件的关闭(fclose函数)文件的打开(fopen函数)fputc函数fgetc函数1.文件类型指针在C语言中,文件的操作必须依靠文件类型指针来完成。在对文件进行操作之前,要先将要操作的文件与文件指针建立联系,然后通过文件指针来操作相应的文件。定义说明文件指针的一般形式为:FILE*指针变量标识符;FILE是一种结构体类型,用来描述文件的有关信息。FILE结构体类型由C语言自身定义,该定义包括在stdio.h头文件中,其内容为:typedefstruct{intlevel;/缓冲池满/空的程度/unsignedflags;/文件状态标记
/charfd;/*文件描述符*/unsignedcharhold;/*如无缓冲区不读入字符*/案例1:复制信息intbsize;/*缓冲区大小*/unsignedchar*buffer;/*缓冲区位置*/unsignedchar*curb;/当前活动指针的位置/unsignedistemp;/*临时文件指示器*/shorttoken;/*有效性检查*/}FILE;可以使用FILE结构体定义FILE类型变量,C编译系统会为这些变量开辟空间存储文件信息。例如,FILEf[3]为结构体数组,其中存放3个文件的信息。更常用的是定义文件类型指针变量,定义格式为:FILE*fp;。其中,fp为指向FILE结构的指针变量,通过fp即可查找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。案例1:复制信息案例1:复制信息2.文件的打开(fopen函数)打开文件可调用库函数fopen来实现,其调用形式为:文件指针名=fopen(文件名,使用文件方式);如果文件打开成功,则返回一个指向FILE类型的指针,并赋给“文件指针名”;“文件名”是字符串常量或字符串数组,是被打开文件的文件名;“使用文件方式”是指文件的类型和操作要求。如果文件打开出错,则返回NULL。常用的打开文件的语句如下。FILE*fp;//定义文件指针fpfp=fopen("file_name","r");//打开文件file_nameif(fp==NULL){//判断文件是否打开成功printf("无法打开此文件!");exit(0);//强制终止程序,需要包含头文件stdlib.h}最常用的文件使用方式及其含义如表8-1所示。案例1:复制信息3.文件的关闭(fclose函数)在文件读/写操作完成之后应该关闭文件,以避免后续的误操作。关闭文件可调用库函数fclose来实现。若关闭操作成功,则函数返回0,否则返回非0值。fclose函数调用的形式为:fclose(文件指针);4.fputc函数fputc函数的功能是把一个字符写入指定的文件中,函数调用的形式为:fputc(字符,文件指针);其中,待写入的字符可以是字符常量或变量。例如:fputc(a,fp);或ch=a;fputc(ch,fp);案例1:复制信息5.fgetc函数fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:字符变量=fgetc(文件指针);案例1:复制信息(1)被写入的文件可以用写、读/写、追加方式打开,用写或读/写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符从文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。(2)每写入一个字符,文件内部位置指针向后移动一个字节。(3)fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回EOF。可用此来判断写入是否成功。注意例如:ch=fgetc(fp);//从打开的文件fp中读取一个字符并送入ch中while(ch!=EOF)//如果没有遇到EOF,就执行循环操作(文本文件的结束标志是EOF或-1)其意义是从打开的文件fp中读取一个字符并送入ch中。案例1:复制信息(1)在fgetc函数调用中,读取的文件必须是以读或读/写方式打开的。(2)在文件内部有一个位置指针,用来指向文件的当前读/写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此,可连续多次使用fgetc函数,读取多个字符。注意案例1:复制信息案例实现算法分析代码实现运行结果1.算法分析第一步:定义文件指针。第二步:判断原有磁盘文件是否为空。第三步:判断新复制磁盘文件是否为空。第四步:将原有磁盘文件中的信息复制到新复制磁盘文件中。2.代码实现#include<stdio.h>//标准输入/输出函数的头文件#include<stdlib.h>//system、exit(0)函数的头文件intmain(){FILE*in,*out;//定义输入文件指针和输出文件指针charch,infile[20],outfile[20];//定义所需变量printf("请输入原有磁盘文件名:\n");scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){//以读方式打开原有文
件,并判断打开是否成功printf("无法打开文件!请确认(%s)文件是否存在。\n\n",infile);案例1:复制信息system("pause");//暂停屏幕,便于观察结果,按任意键退出exit(0);//打开文件不成功则退出程序}printf("请输入新复制磁盘文件名:\n");scanf("%s",outfile);if((out=fopen(outfile,"w"))==NULL){//以写方式打开新文件,并判断打开是否成功printf("无法打开文件!(%s)\n\n",outfile);system("pause");//暂停屏幕,便于观察结果,按任意键退出exit(0);//打开文件不成功则退出程序}while(!feof(in))//只要不到文件结尾就执行循环fputc(fgetc(in),out);//从in指向的文件读取字符,并写入out指向的文件案例1:复制信息printf("文件复制成功,请查看!\n\n");//提示信息fclose(in);//关闭文件fclose(out);system("pause");//暂停屏幕,便于观察结果,按任意键退出return0;}案例1:复制信息3.运行结果程序运行结果如图8-2所示。案例1:复制信息案例2:转存信息案例2:转存信息从键盘输入3个学生的有关数据,然后把它们转存到磁盘文件中去。案例描述相关知识fwrite函数fprintf函数fread函数fscanf函数1.fwrite函数写数据块函数调用的一般形式为:fwrite(buffer,size,count,fp);其中,buffer是数据块的指针,在fwrite函数中是准备输出数据块的首地址,size表示数据块的字节数,count表示每读/写一次要读/写的数据块的个数,fp表示文件指针。如果文件以二进制形式打开,用fwrite函数可以写任何类型的信息。例如:fwrite(double_array,8,3,fp);其中,double_array是一个double类型的数组,一个double类型变量占8个字节。这个函数从double_array数组中向fp所指向的文件写入2次(每次8个字节)的数据。2.fread函数写数据块函数调用的一般形式为:fread(buffer,size,count,fp);函数参数的定义与fwrite函数相同。案例2:转存信息3.fprintf函数格式化写函数的作用是按格式将内存中的数据转换成对应的字符,并以ASCII代码形式输出到文本文件中。其调用形式为:fprintf(文件指针,格式控制字符串,输出表列);例如:fprintf(fp,"%d,%s",num,name);其作用是将整型变量num和字符数组name写入fp所指向的文件中。为便于以后读入数据,将两数据用空格隔开。4.fscanf函数格式化写函数的作用是从文本文件中按格式输入,其调用格式为:fscanf(文件指针,格式控制字符串,输出表列);例如:fscanf(fp,"%d%d",&a,&b);其作用从fp所指向的文件中读入两个整数到变量a和b中。此处要求文件中的两个整数之间已经用空格或Enter键等分隔开。案例2:转存信息案例2:转存信息案例实现算法分析代码实现运行结果1.算法分析第一步:定义结构体。第二步:定义save函数。第三步:输入学生信息。第四步:调用save函数,转存信息。第五步:打开文件,读取信息。2.代码实现#include<stdio.h>//标准输入/输出函数的头文件#include<stdlib.h>//system、exit(0)函数的头文件#defineSIZE3//定义符号常量structstudent{//定义结构体数组charname[20];intnum;intage;charclassname[20];}stud[SIZE];案例2:转存信息voidsave(){//定义save函数,保存学生信息FILE*fp;inti;if((fp=fopen(“student.txt”,“wb”))==NULL){//以只写方式打开二进制文//件,并判断是否成功printf("无法打开此文件!\n");return;//打开失败,则流程返回到主函数}for(i=0;i<SIZE;i++){if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)
//sizeof函数用来求取占用的内存大小printf("文件写入错误!\n");}printf("学生信息已成功写入文件(student.txt),请查看!\n\n");fclose(fp);//关闭文件指针}案例2:转存信息intmain(){inti;FILE*p;//定义文件指针printf("输入学生信息(姓名学号年龄班级):\n");for(i=0;i<SIZE;i++)//输入学生信息scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].classname);save();//调用save函数将学生信息写入文件if((p=fopen("student.txt","rb"))==NULL){//以只读方式打开文件,并判断是否成功printf("无法打开文件!\n");exit(0);}printf("从文件(student.txt)中读取的学生信息为:\n");案例2:转存信息for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structstudent),1,p);//将学生信息读入结构体变量printf("%-8s%4d%4d%-8s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].classname);//输出
}system("pause");//暂停屏幕,便于观察结果,按任意键退出return0;}案例2:转存信息3.运行结果程序运行结果如图8-3所示。案例2:转存信息案例3:文件的定位案例3:文件的定位在磁盘文件中存有5个学生的数据,要求将第1、3、5个学生的数据输入计算机并显示出来。案例描述相关知识rewind函数fseek函数前面的文件操作都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。如果要读写文件中的某一部分,就需要将文件内部的位置指针移动到需要读写的位置再进行读写,这种读写称为随机读写。如果要实现文件的随即读写,就要先进行文件定位。1.rewind函数rewind函数的功能是把文件内部的位置指针移到文件开始处,调用形式为:rewind(文件指针);2.fseek函数fseek函数用来移动文件内部位置指针到指定的位置上,接下来的读或写操作将从此位置开始。调用形式为fseek(文件指针,位移量,起始点);案例3:文件的定位其中,“文件指针”指向被移动的文件;“位移量”是以字节为单位的位移量,长整型数,要求加后缀“L”;“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首、当前位置和文件末尾。其表示方法如表8-2所示。例如:fseek(fp,10L,SEEK_CUR);其含义是把位置指针从当前位置移到此后10个字节处。案例3:文件的定位案例3:文件的定位案例实现算法分析代码实现运行结果1.算法分析第一步:定义结构体。第二步:循环读取文件中的指定信息。2.代码实现#include<stdio.h>//标准输入/输出函数的头文件#include<stdlib.h>//system、exit(0)函数的头文件structstudent{//定义结构体类型及数组charname[10];intnum;intage;charsex;}stud[5];voidsave(){//定义save函数,保存学生信息FILE*fp;inti;案例3:文件的定位if((fp=fopen("student.txt","wb"))==NULL){//以只写方式打开二进制文件,并判断是否成功printf("无法打开此文件!\n");return;//打开失败,则流程返回到主函数}for(i=0;i<5;i++){//sizeof函数用来求取占用的内存大小if(fwrite(&stud[i],sizeof(structstudent),1,fp)!=1)printf("文件写入错误!\n");}printf("学生信息已成功写入文件(student.txt),请查看!\n\n");fclose(fp);//关闭文件指针}intmain(){inti;FILE*p;//定义文件指针案例3:文件的定位printf("输入学生信息(姓名学号年龄性别):\n");for(i=0;i<5;i++)//输入学生信息scanf("%s%d%d%c",stud[i].name,&stud[i].num,&stud[i].age,&stud[i].sex);save();//调用save函数将学生信息写入文件if((p=fopen("student.txt","rb"))==NULL){//以只读方式打开文件,
并判断是否成功printf("无法打开文件!\n");exit(0);}案例3:文件的定位printf("从文件(student.txt)中读取的第1、3、5学生信息为:\n");for(i=0;i<5;i+=2){fseek(p,i*sizeof(structstudent),0);fread(&stud[i],sizeof(structstudent),1,p);printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);}fclose(p);system("pause");//暂停屏幕,便于观察结果,按任意键退出return0;}案例3:文件的定位3.运行结果程序运行结果如图8-4所示。案例3:文件的定位案例4:文件检测案例4:文件检测输入信息到文件中,并将其显示在屏幕上。案例描述相关知识feof函数clearerr函数ferror函数1.feof函数文件结束检测函数feof的功能是判断文件是否处于文件结束位置,若文件结束,则返回值为1,否则为0。其调用形式为:feof(文件指针);2.ferror函数读写文件出错检测函数ferror的功能是检查文件在用各种输入输出函数进行读写时是否出错。若ferror返回值为0,则表示未出错,否则表示有错。其调用形式为:ferror(文件指针);3.clearerr函数文件出错标志和文件结束标志置零函数clearerr的功能是清除出错标志和文件结束标志,使它们为0值。其调用形式为:clearerr(文件指针);。案例4:文件检测案例4:文件检测案例实现算法分析代码实现运行结果1.算法分析第一步:打开文件。第二步:输入信息到文件中。第三步:将文件内部的位置指针移到文件首,读取文件。第四步:将信息输出到屏幕上。2.代码实现#include<stdio.h>//标准输入/输出函数的头文件#include<stdlib.h>//system()、exit(0)函数的头文件#include<string.h>//字符串函数的头文件intmain(){charin_str[100],out_str[100];FILE*fp;//定义文件指针inti;if((fp=fopen("test.txt","wb+"))==NULL){
//打开文件,并判断是否成功案例4:文件检测printf("无法打开文件!\n");exit(0);//不成功则退出程序}printf("请输入一个字符串:");scanf("%s",in_str);//输入字符串到数组fputs(in_str,fp);//将数组中的字符串写入文件printf("该字符串已经写入test.txt文件中,请查看!\n\n");rewind(fp);//将文件内部位置指针重新定位到文件开关i=0;while(!feof(fp)){//只要文件没到结尾就执行循环fread(&out_str[i],1,1,fp);
//将文件中的内容读取到数组中i++;}案例4:文件检测out_str[i-1]=\0;//在字符数组末尾加上字符串结束标志printf("从test.txt文件中读取的字符串是:");printf("%s\n",out_str);//再输出字符串fclose(fp);//关闭文件system("pause");//暂停屏幕,便于观察结果,按任意键退出return0;}案例4:文件检测案例4:文件检测3.运行结果程序运行结果如图8-5所示。一、选择题1.()命令用于重新命名文件。(C语言二级考试题)A.Dir B.rd C.ren D.cd2.()命令用于将一个文件从一个位置移到另一个位置。(C语言二级考试题)A.Move B.copy C.cut D.paste3.()文件系统可提高磁盘性能、可靠性和空间利用率,还有其他扩展功能,如安全访问控制列表和文件系统日志。(C语言二级考试题)A.FAT12 B.FAT16 C.FAT32 D.NTFS4.设当前盘为C盘,为了将A盘当前目录中所有扩展名为“.PAS”的文件改成扩展名为“.P”,应使用的DOS命令为()。(C语言二级考试题)A.RENA:*.PASA:*.P B.RENA:*.PAS*.PC.RENA:.PASA:.P D.RENA:.PAS.P同步训练5.设当前盘为A盘,要将B盘当前目录中的两个文件A.TXT与X.TXT连接后以文件名Y.TXT存放到A盘的当前目录中,正确的DOS命令为()。(C语言二级考试题)A.COPYA.TXT+X.TXTA:Y.TXT B.COPYB:A.TXT+X.TXTA:Y.TXTC.COPYB:A.TXT+B:X.TXT>Y.TXTD.COPYB:A.TXT+B:X.TXTY.TXT6.在C语言中,二进制文件中的数据存放格式和整数-12345占用的字节数分别为()。A.ASCII码方式、4个字节 B.ASCII码方式、2个字节C.二进制数方式、2个字节 D.二进制数方式、4个字节7.存储整型数据-7865时,在二进制文件和文本文件中占用的字节数分别是()。A.2和2 B.2和5 C.5和5 D.5和2同步训练8.以只写方式打开一个二进制文件,应选择的文件操作方式是()。A."a+“ B."w+“ C."RB“ D."wb"9.有如下函数段。intfile_err(fpp)FILE*fpp;{if(ferror(fpp))return(1);elsereturn(0);}则下列说法正确的是()。A.函数的功能是测试fpp所指向的文件最后一次操作是否正确B.函数的功能是返回1C.函数的功能是返回0D.函数的功能是测试fpp所指向的文件最近一次操作是否正确同步训练10.一般情况下,以下函数功能相同的是()。A.fputc和putchar B.fwrite和fputcC.fread和fgetc D.putc和fputc11.若执行fopen函数时发生错误,则函数的返回值是()。A.地址值 B.0 C.1 D.EOF12.若要用fopen函数打开一个新的二进制文件,该文件既要能读也能写,则文件打开方式字符串应是()。A."ab+“ B."wb+“ C."rb+“ D."ab“13.若以"a+"方式打开一个已存在的文件,则以下叙述正确的是()。A.文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可做添加和读操作B.文件打开时,原有文件内容不被删除,位置指针移到文件开头,可做重写和读操作C.文件打开时,原有文件内容被删除,只可做写操作D.以上说法都不正确同步训练14.利用fseek函数可实现的操作是()。A.改变文件的位置指针B.文件的顺序读写C.文件的随机读写D.以上答案均正确15.函数调用语句“fseek(fp,-20L,2)”的含义是()。A.将文件位置指针移到距离文件头20个字节处B.将文件位置指针从当前位置向后移动20个字节C.将文件位置指针从文件末尾向后退20个字节D.将文件位置指针移到距离当前位置20个字节处16.fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是()。A.只写B.追加C.读或读写D.B和C都正确同步训练17.函数rewind的作用是()。A.使位置指针重新返回文件的开头 B.将位置指针指向文件中所要求的特定位置C.使位置指针指向文件的末尾 D.使位置指针自动移至下一个字符位置18.若f1是指向某文件的指针,且已读到此文件的末尾,则函数feof(f1)的返回值是()。A.EOF B.0 C.1 D.NULL19.fseek函数的正确调用形式是()。A.fseek(文件指针,起始点,位移量) B.fseek(文件指针,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职高函数专项考试试题及答案
- 平面连杆机构考试试题及答案
- 混凝土外观质量考试试题及答案
- 波峰焊考试试题及答案
- 物流仓储管理系统数据备份与恢复方案
- 物联网应用实践与优化策略
- 客户服务满意度调查问卷模板用户反馈收集型
- 2026年广东省信宜市高一历史下册期末考试考试卷附完整答案【典优】
- 2026年安徽省巢湖市高二历史上册期末考试考试卷有完整答案
- 2026年江西省樟树市高三历史下册期末考试自测卷【典优】附答案
- 2025年贵州省中考物理真题含答案
- DB5104∕T82-2023 康养产业项目认定规范
- 【政史地 高考西北卷】2025年高考招生考试真题政治+历史+地理试卷(适用陕西、山西、青海、宁夏四省)
- 氢氟酸仓库管理制度
- 中医护理艾箱灸操作流程
- 高考英语必背688个高频词汇清单
- 肺心病患者的健康教育
- 2025年3月29日全国事业单位联考E类《职测》真题及答案
- 第10课 金与南宋对峙 七年级历史下册人教统编2024版
- 美容师模拟试题+答案
- DLT 572-2021 电力变压器运行规程
评论
0/150
提交评论