版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章
文件内容简介⑴文件类型指针。⑵文件的打开和关闭。⑶文件的读写。(4)文件的定位。11.1文件概述11.1 文件概述所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。文件通常是存储在外部存储器中(如磁盘等)上的,在使用时才调入内存中来,该过程被称为打开文件操作,用户也可以通过程序将数据输出到文件中,该过程称为文件的保存操作。文件的分类①从用户处理文件的的角度看,文件可分为普通文件和设备文件两种。②从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。文件系统目前C语言所使用的磁盘文件系统有两大类:一类称为缓冲文件系统,又称为标准文件系统;另一类称为非缓冲文件系统。11.2文件类型指针11.2 文件类型指针typedefstruct{shortlevel;/*缓冲区的满/空状态*/unsignedflags;/*文件状态旗标*/charfd;/*文件描述*/unsignedcharhold;/*如无缓冲区不读取字符*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据传输缓冲区*/unsignedchar*curp;/*当前激活的指针*/unsignedistemp;/*临时文件指示符*/shorttoken;/*有效性检查*/}FILE;通常使用FILE结构类型定义文件指针变量,例如:FILE*fp;/*fp是一个指向FILE类型结构体的指针变量*/使用fp指向某一个文件,从而可以访问文件的信息。11.3文件的打开和关闭文件的打开和关闭文件的打开文件打开采用fopen()函数。一般格式:FILE *fp;fp=fopen("文件名","文件打开方式");功能:该函数可以返回一个指向“文件名”的FILE类型的指针。“文件名”是指要打开(或创建)的文件名;“文件打开方式”代表对文件的访问方式。例如:fp=fopen("data.dat","r");11.3文件的打开和关闭文件使用方式含义“r/rb”(只读)为读入打开一个文本/二进制文件“w/wb”(只写)为写入打开或建立一个文本/二进制文件“a/ab”(追加)向文本/二进制文件尾追加数据“r+/rb+”(读写)为读/写打开一个文本/二进制文件“w+/wb+”(读写)为读/写建立一个文本/二进制文件“a+/ab+”(读写)为读/写打开或建立一个文本/二进制文件常用的文件打开方式及其含义见表11-1所示。表11-1文件打开方式及其含义11.3文件的打开和关闭11.3.2 文件的关闭在C语言中,文件的关闭是通过fclose函数来实现。此函数的声明在“stdio.h”中。一般格式:intfclose(FILE*fp);功能:关闭文件指针fp指向的文件。说明:FILE*fp——指向要关闭文件的指针。函数返回值——int类型,如果为0,则表示文件关闭成功,否则返回EOF表示失败。11.4文件的读写11.4.1 文件单字符的读写文件单字符的读写以字符为单位的读写函数,可以从指定的文件每次读出或写入单个字符。(1)文件读一个字符函数fgetc一般格式:intfgetc(FILE*fp);功能:从指定的文件中读一个字符,函数返回值为int类型。如果返回值为-1(EOF),表示已经读到文件末尾,否则返回读到的字符的ASCII码。例如:charch;ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入ch中。11.4文件的读写【例11-1】读c盘user1文件夹下的文件data.txt,并在屏幕上输出其内容。#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen("c:\\user1\\data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}ch=fgetc(fp);/*从文件中先读取一个字符,存入变量ch中*/while(ch!=EOF)/*是否已经读到文件末尾*/{putchar(ch);/*将变量ch的内容在显示器上输出*/ch=fgetc(fp);/*从文件中读取下一个字符,并存入变量ch中*/}putchar("\n");fclose(fp); }11.4文件的读写(2)文件写入一个字符函数fputc一般格式:intfputc(intc,FILE*fp);功能:把一个字符写入指定的文件中,该字符的ASCII值由参数c指定,待写入的字符也可以是字符常量或变量,例如:fputc("A",fp);其意义是把字符A写入(存入)到fp所指向的文件中。11.4文件的读写【例11-2】综合利用文件字符的读写函数,实现文件复制。#include"stdio.h"voidmain() {FILE*fpOrg,*fpDes;charOrgFile[10];charDesFile[10];charch;printf("请输入原始文件名:\n");scanf("%s",OrgFile);printf("请输入目标文件名:\n");scanf("%s",DesFile);if((fpOrg=fopen(OrgFile,"r"))==NULL)/*以读方式打开文件OrgFile*/{printf("Openfilefailed!\n");exit(0);}if((fpDes=fopen(DesFile,"w"))==NULL)/*以写方式打开文件DesFile*/{printf("Openfilefailed!\n");exit(0);}while((ch=fgetc(fpOrg))!=EOF)/*从文件OrgFile中读一个字符,存入到变量ch中*/fputc(ch,fpDes);/*将变量ch中的字符写入到文件DesFile中*/fclose(fpOrg);fclose(fpDes); }11.4文件的读写11.4.2 格式化读写函数(1)格式化写入fprintf函数一般格式:intfprintf(FILE*fp,格式字符串,输出项表列);功能:将输出项表列按照指定的格式输出到fp所指的文件中去。该函数的返回值为整型,如果成功则返回已经写入的字节数,写入失败返回负数。11.4文件的读写【例11-3】使用fprintf函数向指定文件中写入数据#include
<stdio.h>main(){FILE
*fp;int
i=1;float
f=3.14;char
s[]="HelloWorld!";char
ch="\n";if((fp=fopen("data.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}fprintf(fp,"%s%c",s,ch);/*以%s%c格式将变量s和ch的内容存入fp指向的文件中*/fprintf(fp,"%d\n",i);/*以%d\n格式将变量i的内容存入fp指向的文件中*/fprintf(fp,"%f\n",f);
/*以%f\n格式将变量f的内容存入fp指向的文件中*/fclose(fp);
}11.4文件的读写(2)格式化读入fscanf函数一般格式:intfscanf(FILE*fp,格式字符串,输入项地址表列);功能:按照“格式字符串”所指定的输入格式,从fp指定文件的当前读写位置开始读出数据,然后把它们按输入项地址表列的顺序存入到指定的存储单元中。该函数的返回值为整型,如果成功则返回输入项表列参数的个数;读入失败或读到了文件的末尾返回EOF。11.4文件的读写【例11-4】使用fscanf函数从指定文件中读数据#include<stdio.h>main(){FILE*fp;inti;floatf;chars[20];if((fp=fopen("data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}fscanf(fp,"%s",s);/*以%s格式从fp指向的文件读字符串,并存入变量s中*/printf("%s\n",s);fscanf(fp,"%d",&i);/*以%d格式从fp指向的文件读整型数据,并存入变量i中*/printf("%d\n",i);fscanf(fp,"%f\n",&f);/*以%f格式从fp指向的文件读实型数据,并存入变量f中*/printf("%f\n",f);fclose(fp); }11.4文件的读写11.4.3 数据块输入/输出函数数据块输入/输出函数属于二进制文件的读写函数,主要包括:(1)块输出函数fwrite一般格式:intfwrite(数据类型名*buffer,unsignedsize,unsignedcount,FILE*fp)功能:将buffer缓冲区中的数据以二进制的形式写入到fp所指定的文件中去。执行过程为:从buffer开始,每次输出size个字节,重复count次,将输出的数据存放到fp所指向的文件中,并将文件的读写位置指针移动size*count个字节,其中buffer是要输出的数据在内存中的起始地址。11.4文件的读写【例11-5】使用fwrite函数向指定文件中输出数据#include<stdio.h>#include<string.h>structStu{charNO[5];charname[10];intscore[3];}main(){FILE*fp;inti;structStustu[3];strcpy(stu[0].NO,"0001");strcpy(stu[0].name,"张三");stu[0].score[0]=65;stu[0].score[1]=95;stu[0].score[2]=75;strcpy(stu[1].NO,"0002");strcpy(stu[1].name,"李四");stu[1].score[0]=56;stu[1].score[1]=78;stu[1].score[2]=89;strcpy(stu[2].NO,"0003");strcpy(stu[2].name,"王五");stu[2].score[0]=61;stu[2].score[1]=66;stu[2].score[2]=93;if((fp=fopen("data.txt","wb"))==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++)fwrite(&stu[i],sizeof(structStu),1,fp);/*从stu[i]首地址开始,每次读取结构体Stu所占的个字节数,重复1次,将全部数据写入fp指向的文件中*/fclose(fp);}11.4文件的读写(2)块输入函数fread一般格式:intfread(数据类型名*buffer,unsignedsize,unsignedcount,FILE *fp)功能:从fp所指定的文件中以二进制形式读取数据块。执行过程为:从fp所指向文件的当前位置开始,每次读入size个字节,重复count次,将读入的数据存放到从buffer开始的内存中,并将文件的读写位置指针移动size*count个字节,buffer是存放读入数据的起始地址。说明:如果调用fread()成功,则函数返回值等于count。11.4文件的读写【例11-6】使用fread函数从指定文件中读数据#include<stdio.h>#include<string.h>structStu{charNO[5];charname[10];intscore[3];}main(){FILE*fp;inti;structStustu[3];if((fp=fopen("data.txt","rb"))==NULL){printf("cannotopenthisfile\n");exit(0);}for(i=0;i<3;i++){/*从fp指向的文件中读取结构体Stu所占字节数,重复1次,并存入到首地址为&stu[i]的内存单元中*/fread(&stu[i],sizeof(structStu),1,fp);printf("学号:%s姓名:%s成绩:%d,%d,%d\n",stu[i].NO,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);}fclose(fp);}11.4文件的读写11.4.4 字符串文件处理函数(1)文件字符串输出函数fputs一般格式:intfputs(char*str,FILE*fp)功能:向指定文件输出一个字符串,同时将文件读写位置指针移动(字符串长度)个字节。如果输出成功,则函数返回值为0;否则返回非0值说明:str代表字符型的指针,可以是字符串的内存首地址或字符串常量;fp代表存入文件的指针;字符串末尾的串结尾标识’\0’不会输出到文件。11.4文件的读写【例11-7】使用fputs函数向指定文件中输出数据#include
<stdio.h>main(){FILE
*fp;if((fp=fopen("data.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}fputs("Hello
World!\n",fp);/*将字符串输出到文件*/fputs("Hello
World!\n",stdout);/*将字符串输出显示器(stdout)*/fclose(fp);}11.4文件的读写(2)文件字符串输入函数fgets一般格式:char*fgets(char*str,intn,FILE*fp)功能:从指定文件中读入一个字符串,存入“字符数组/指针”中,并在尾端自动加一个结束标志"\0";并将文件读写位置指针移动(字符串长度)+1个字节。如果在读入规定长度之前遇到文件尾EOF或换行符,读入即结束说明:str可以为字符型的指针变量或数组名;fp代表读取文件指针;n为读取的最大字符长度,包含字符串的最后一个字符"\0",即从fp指向的文件中读取n-1个字符。11.4文件的读写【例11-8】使用fgets函数从指定文件中读取数据#include<stdio.h>main(){FILE*fp;charstr[20];if((fp=fopen("data.txt","r"))==NULL){printf("cannotopenthisfile\n");exit(0);}fgets(str,5,fp);/*从fp指向的文件中读取前4个字符,并存入到数组str中*/printf("%s\n",str);fgets(str,9,fp);/*从fp指向的文件中继续读取8个字符,并存入到数组str中*/printf("%s\n",str);fclose(fp);}11.5文件的定位文件的定位文件指针重置函数rewind一般格式:rewind(文件指针);功能:将文件内部的位置指针重新移到文件首。该函数没有返回值。11.4文件的读写【例11-9】rewind函数的应用
#include<stdio.h>
main(){FILE
*fp,*fp1;if((fp=fopen("data.txt","r"))==NULL){printf("can
not
open
this
file\n");exit(0);}if((fp1=fopen("data1.txt","w"))==NULL){printf("can
not
open
this
file\n");exit(0);}while(!feof(fp))putchar(fgetc(fp));rewind(fp);/*从文件的位置指针重新指向文件首*/while(!feof(fp))fputc(fgetc(fp),fp1);fclose(fp);fclose(fp1);}11.5文件的定位11.5.2fseek函数。fseek函数用来移动文件内部位置指针,以便进行随机读写文件的内容。一般格式:fseek(文件指针,位移量,起始点);其中:① “文件指针”指向被移动的文件。② “位移量”为long型数据,代表移动的字节数,正数代表向文件尾移动,负数为向文件首移动;当用常量表示位移量时,要求加后缀“L”。③ “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首
当前位置文件末尾SEEK_SETSEEK_CURSEEK_END012功能:从指定的位置开始,将文件的位置指针移动若干位移量。例如:fseek(fp,10L,0);/*将位置指针移到离文件首10个字节处*/fseek(fp,20L,1);/*将位置指针从当前位置向文件尾部移动20个字节*/fseek(fp,-2L,3);/*将位置指针从文件末尾向文件首部移动2个字节*/说明:fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。11.4文件的读写【例11-10】磁盘文件data.txt中存放了5个学生的学号、姓名和成绩记录,要求将001、003和005号学生的数据显示输出。#include<stdio.h>#include<string.h>structstu{charID[4];charname[6];intscore;}stu[5],stu1[5];main(){FILE*fp,*fp1;inti;strcpy(stu[0].ID,"001");strcpy(stu[0].name,"李平");stu[0].score=90;strcpy(stu[1].ID,"002");strcpy(stu[1].name,"张青");stu[1].score=65;strcpy(stu[2].ID,"003");strcpy(stu[2].name,"赵虎");stu[2].score=72;strcpy(stu[3].ID,"004");strcpy(stu[3].name,"王值");stu[3].score=46;strcpy(stu[4].ID,"005");strcpy(stu[4].name,"许宏");stu[4].score=78;if((fp=fopen("data.txt","wb"))==NULL){printf("Cannotopenfile!");exit(0); }fwrite(&stu[0],sizeof(struct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度工程安装居间合同2篇
- 项目经理合作协议书 2篇
- 售房补充协议 3篇
- 化妆品销售合同简单范本
- 高二期中家长会课件
- 饮品购销合同书范本
- 2024年度高速公路沥青混凝土搅拌站租赁合同2篇
- 基于AR技术的虚拟展览服务合同(2024版)
- 股权转让协议书范本合同范本标准版
- 《技术员岗位职责》课件
- 协会第五届换届选举筹备工作汇报
- 陶粒混凝土配合比
- 接触网基础知识
- 《物流设施与设备》期末试卷A及答案(共5页)
- 渠道划分及成功图像执行培训课件
- WTO专题(原产地规则)
- 人教版四年级上英语单词默写表-
- 危重患者抢救护理
- 浅谈小学音乐课中实施合作教学的策略
- 宣传片验收单.doc
- IEC-68-2-1-试验方法
评论
0/150
提交评论