




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章文件C文件概述文件类型指针文件的打开与关闭文件的读写文件的定位出错的检测文件输入输出小结13.1C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放如int型数10000=0x27100010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:需存储量大、速度慢、便于对字符操作二进制文件特点:需存储量小、速度快、便于存放中间结果文件处理方法:对一个存储在磁盘上的文件进行读取、修改,必须要先打开它,建立内存缓冲区,以便CPU读写。缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:缓冲区指令区程序用户数据区磁盘非缓冲文件系统:13.2文件类型指针
1、文件信息结构体FILE
缓冲文件系统为每个正使用的文件在内存开辟文件信息区:用以描述文件缓冲区的内存位置、大小、当前读写位置和文件的状态等。文件信息用系统定义的名为FILE的文件信息结构体描述FILE定义在stdio.h中typedef
struct{shortlevel;//缓冲区“满”或“空”的程度
unsignedflags;//文件状态标志
charfd;//文件描述符
unsignedcharhold;//如无缓冲区不读取字符
shortbsize;//缓冲区的大小
unsignedchar*buffer;//数据缓冲区的位置
unsignedchar*curp;//位置指针,当前的指向
unsignedistemp;//临时文件,指示器
shorttoken;//用于有效性检查}FILE;磁盘文件
a.txt文件信息结构体类型FILE描述的是文件信息,借助该文件信息来访问文件缓冲区,从而对文件读写。输入缓冲区输出缓冲区typedef
struct{shortlevel;//缓冲区“满”或“空”的程度
unsignedflags;//文件状态标志
charfd;//文件描述符
unsignedcharhold;//如无缓冲区不读取字符
shortbsize;//缓冲区的大小
unsignedchar*buffer;//数据缓冲区的位置
unsignedchar*curp;//指针,当前的指向
unsignedistemp;//临时文件,指示器
shorttoken;//用于有效性检查}FILE;2、文件类型指针(1)文件类型指针概念:定义一个指针,让其指向一个打开的文件的文件信息区。FILE*fp;
(2)用法:C语言对文件读写,是借助于文件类型指针fp进行的。当要打开某文件时,执行fp=fopen(“文件名”“读/写”),系统会自动建立文件结构体,并把指向它的指针返回来赋给fp,程序就可通过指针fp获得要访问的文件信息,从而访问文件缓冲区,进而访问文件。当要关闭某文件时,将fp做为实参,调用函数fclose(fp)后,该文件结构体即被释放,从而也无法对该文件再访问。文件类型指针磁盘文件fp输入缓冲区输出缓冲区文件信息结构体类型FILE描述的是文件信息,借助该文件信息来访问文件a.txt13.3文件的打开与关闭C文件操作用库函数实现,库函数包含于stdio.h★对文件的读写应该按指定的操作方式打开打开文件使用方式:打开文件-->文件读/写-->关闭文件★打开文件fopen函数原型:FILE*fopen(char*name,char*mode)函数调用举例功能:按指定方式打开指定的文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL要打开的文件名使用文件方式例FILE*fp;
fp=fopen(“d:\\sha\\a.txt”,“r”);
例FILE*fp;char*filename=“d:\\sha\\a.txt”fp=fopen(filename,“r”);
“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为输入打开一个文本/二进制文件为输出打开或建立一个文本/二进制文件为读/写打开一个文本/二进制文件为读/写建立一个文本/二进制文件为读/写打开或建立一个文本/二进制文件向文本/二进制文件尾追加数据文件使用方式含义例FILE*fp;
fp=fopen(“d:\\sha\\a.txt”,“w”);
例文件打开与测试
FILE*fp;
fp=fopen(“aa.c”,“r”);
if(fp==NULL){
printf(“Fileopenerror!\n”);
exit(0);}说明:1、用带“w”的方式(“w”、“wb”、“w+”、“wb+”)打开文件时,该文件可以不存在,若该文件不存在,则自动创建一个。2、用带“r”的方式(“r”、“rb”、“r+”、“rb+”)打开文件时该文件必须要存在。若文件不存在,则返回NULL指针。一般用以下方式检查是否成功打开:exit(0)是程序返回操作系统。关于exit()函数用法:voidexit([程序状态值]);功能:关闭已打开的所有文件,结束程序运行,返回操作系统,并将“程序状态值”返回给操作系统。当“程序状态值”为0时,表示程序正常退出;非0值时,表示程序出错退出。文件关闭fclose作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针函数原型:int
fclose(FILE*fp)fp为文件打开时返回的文件类型指针功能:关闭fp指向的文件返值:正常关闭为0;出错时EOF(-1)磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fclose不关闭文件可能会丢失数据★三个标准文件:标准输入------键盘stdin标准输出------显示器stdout标准出错输出-----显示器stderr对这三个标准文件系统是自动打开和关闭(不需要语句fopen、fclose来操作)13.4文件的读写文件打开之后,就可以对它进行读与写的操作了。1读/写文件中的一个字符
2读/写一个字符串3读/写一个数据块4对文件进行格式化读/写
13.4文件的读写
1、字符I/O:fputc与fgetcfgetc函数原型:int
fgetc(FILE*fp)功能:从fp指向的文件中读取一字节代码返值:正常,返回读到的代码值;读到文件尾或出错,为EOFfputc函数原型:int
fputc(intc,FILE*fp)功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,为EOF函数调用形式fputc(ch,fp);fgetc(fp);例13.1从键盘输入字符,逐个存到磁盘文件中,直到输入‘#“为止#include<stdio.h>main(){FILE*fp;charch,*filename=“out.txt”;
if((fp=fopen(filename,"w"))==NULL){printf("cannotopenfile\n");exit(0);}
printf("Pleaseinputstring:");
ch=getchar();
while(ch!='#'){fputc(ch,fp);//把ch输出到文件
putchar(ch);//把ch输出到显示器
ch=getchar();}
fclose(fp);}运行情况如下:computer#↙computer(输出在屏幕)同时写到文件out.txt里
文件写操作例读文本文件内容,并显示#include<stdio.h>main(){FILE*fp;charch,*filename=“out.txt”;
if((fp=fopen(filename,”r"))==NULL){printf("cannotopenfile\n");exit(0);}
while((ch=fgetc(fp))!=EOF)
putchar(ch);
fclose(fp);}判断文本文件是否结束文件读操作
while(!feof(fp)){ch=fgetc(fp);putchar(ch);}
条件成立,即未到达文件末尾时,执行循环。函数原型:int
feof(FILE*fp)功能:判断是否到达文件末尾返值:到达文件尾,返回真;
未到达文件末尾,返回0注:判断文本文件是否结束也可用feof()函数。若文件为二进制文件,判断二进制文件是否结束,只能用feof()函数。
例13.2文件拷贝#include<stdio.h>main(){FILE*in,*out;charch,infile[10],outfile[10];
scanf("%s",infile);
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL){printf("Cannotopeninfile.\n");
exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("Cannotopenoutfile.\n");exit(0);}
while(!feof(in))
fputc(fgetc(in),out);
fclose(in);
fclose(out);}运行情况如下:file1.cfile2.c程序运行结果:将file1.c文件中的内容复制到file2.c中去。2、数据块I/O:fread与fwrite函数原型:unsignedfread(void*buffer,unsignedsize,unsignedcount,FILE*fp);unsignedfwrite(void*buffer,unsignedsize,unsignedcount,FILE*fp);功能:读/写数据块返值:成功,返回读/写的块数;出错或文件尾,返回0说明:buffer:指向要输入/输出数据块的首地址的指针size:每个要读/写的数据块的大小(字节数)count:要读/写的数据块的个数fp:要读/写的文件指针fread与fwrite
一般用于二进制文件的输入/输出例floatf[10];FILE*fp;
fp=fopen(“d:\\sha\\aa.dat”,“rb”);
fread(f,4,2,fp);文件以二进制读形式打开,此函数从fp所指向的文件d:\\sha\\aa.dat中读入2个块长4个字节的数据,存储到数组f中。for(i=0;i<2;i++)
fread(&f[i],4,1,fp);例structstudent{intnum;charname[20];charsex;
intage;floatscore[3];}stud[10];for(i=0;i<10;i++)
fread(&stud[i],sizeof(structstudent),1,fp);
fwrite(&stud[i],sizeof(structstudent),1,fp);例13.3从键盘输入4个学生数据,把他们从内存转存到磁盘文件中,再从文件读回到内存并显示#include<stdio.h>#defineSIZE4structstudent_type{charname[10];
intnum;
intage;charaddr[15];}stud[SIZE];/*定义结构*/main(){
inti;for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr);
save();//写入到文件stu_datdisplay();再从stu_dat中读}voidsave()//从内存数组stud写入到文件stu_dat中{FILE*fp;
inti;
if((fp=fopen("d:\\sha\\1\\stu_dat","wb"))==NULL){printf("cannotopenfile\n"); return;}for(i=0;i<SIZE;i++)
if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)
printf("filewriteerror\n");
fclose(fp);}voiddisplay()//再从磁盘文件stu_dat读到内存数组stud中{FILE*fp;
inti;
if((fp=fopen(“d:\\sha\\1\\stu_dat","rb"))==NULL){printf("cannotopenfile\n"); return;}for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(structstudent_type),1,fp);printf("%-10s%4d%4d%-15s\n",stud[i].name,
stud[i].num,stud[i].age,stud[i].addr);}
fclose(fp);}3、格式化I/O:fprintf与fscanf函数原型:int
fprintf(FILE*fp,constchar*format[,argument,…])int
fscanf(FILE*fp,constchar*format[,address,…])功能:按指定格式对文件进行I/O操作返值:成功,返回I/O的个数;出错或文件尾,返回EOF例fprintf(fp,“%d,%6.2f”,i,t);
//将i和t按%d,%6.2f格式输出到fp文件
fscanf(fp,“%d,%f”,&i,&t);
//若文件中有3,4.5,则将3送入i,4.5送入t#include<stdio.h>main(){chars[80],c[80];
inta,b;FILE*fp;
if((fp=fopen("test","w"))==NULL){puts("can'topenfile");exit();}
fscanf(stdin,"%s%d",s,&a);/*readfromkeyboard*/
fprintf(fp,"%s%d",s,a);/*writetofile*/
fclose(fp);
if((fp=fopen("test","r"))==NULL){puts("can'topenfile");exit();}
scanf(fp,"%s%d",c,&b);/*readfromfile*/
fprintf(stdout,"%s%d",c,b);/*printtoscreen*/
fclose(fp);}例从键盘按格式输入数据存到磁盘文件中,再从文件读回显示4、字符串I/O:fgets与fputs函数原型:char*fgets(char*s,intn,FILE*fp)
int
fputs(char*s,FILE*fp)返值:fgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLfputs正常时返回写入的最后一个字符;出错为EOFfgets从fp所指文件读n-1个字符送入s指向的内存区,并在最后加一个‘\0’(若读入n-1个字符前遇换行符或文件尾(EOF)即结束)fputs把s指向的字符串写入fp指向的文件功能:从fp指向的文件读/写一个字符串#include<stdio.h>main(){FILE*fp;charstring[81];
if((fp=fopen("file.txt","w"))==NULL){printf("cann'topenfile");exit(0);}
while(strlen(gets(string))>0){fputs(string,fp);
fputs("\n",fp);}
fclose(fp);
if((fp=fopen("file.txt","r"))==NULL){printf("cann'topenfile");exit(0);}while(fgets(string,81,fp)!=NULL)
fputs(string,stdout);
fclose(fp);}例从键盘读入字符串存入文件,再从文件读回显示(略)13.5文件的定位几个概念文件位置指针-----指向文件缓冲区当前读写位置的指针读写方式顺序读写:位置指针按字节位置顺序移动,叫~
一般情况下,位置指针按字节顺序移动,读完当前会按顺序自动跳到下一个单元。如之前所讲,fread()函数在读取过程中,就是这样。当需要读写的并非是下一个单元时,需要改变位置指针位置进行随机读写。随机读写:位置指针按需要移动到任意位置,叫~1、rewind函数
2、fseek函数#include<stdio.h>main(){FILE*fp1,*fp2;fp1=fopen(“d:\\sha\\4.c","r");fp2=fopen("d:\\sha\\41.c","w");//读文件4.c内容,并输出到显示屏
while(!feof(fp1))putchar(getc(fp1));
//让文件位置指针回到文件开头
rewind(fp1);
//读文件4.c内容,并输出到文件41.cwhile(!feof(fp1))
putc(getc(fp1),fp2);
fclose(fp1);fclose(fp2);}例对一个磁盘文件进行显示和复制两次操作1、rewind函数函数原型:
voidrewind(FILE*fp)功能:
重置文件位置指针指针到文件开头返值:无2、fseek函数函数原型:int
fseek(FILE*fp,long
offset,intwhence)功能:改变文件位置指针的位置,确定参照物返值:成功,返回0;失败,返回非0值文件位置指针移到何处?位移量(以起始点为基点,移动的字节数)>0
前进移动<0
后退移动起始点whence:参照物文件开始
SEEK_SET0文件当前位置
SEEK_CUR1文件末尾
SEEK_END2例fseek(fp,100L,0);fseek(fp,50L,1);fseek(fp,-10L,2);例磁盘文件上有3个学生数据,要求读入第0,2学生数据并显示main(){inti;FILE*fp;
if((fp=fopen("studat","rb"))==NULL){printf("can'topenfile\n");exit(0);}for(i=0;i<3;i+=2){fseek(fp,i*sizeof(structstudent_type),0);
fread(&stud[i],sizeof(structstudent_type),1,fp);
printf("%s%d%d%s\n",
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}
fclose(fp);}#include<stdio.h>structstudent_type{intnum;charname[10];
intage;charaddr[15];}stud[3];
#include<stdio.h>voidmain(){
struct
st{
int
x,y;}st1[5]={10,11,20,21,30,31,40,41,50,51},st2[5];
inti;FILE*fp;
fp=fopen(“stu.dat”,“wb+”);
fwrite(st1,sizeof(structst),5,fp);
rewind(fp);例:阅读下列程序,分析程序的功能和输出结果(实验题)for(i=0;i<3;i++){
fread(&st2[i],sizeof(structst),1,fp);
fseek(fp,sizeof(structst),1);//
注:当i=0时,读完第0个元素,当前位置为第1个元素开头,再移动1个struct
st后,位置变为第2个元素开头。}
fseek(fp,-4L*sizeof(structst),2);for(i=3;i<5;i++){fread(&st2[i],sizeof(structst),1,fp);
fseek(fp,sizeof(structst),1);}for(i=0;i<5;i+=2)printf(“%d,%d\n”,st2[i].x,st2[i].y);
fclose(fp);}3、ftell函数函数原型:longftell(FILE*fp)功能:返回位置指针当前位置(用相对文件开头的位移量表示)返值:成功,返回当前位置指针位置;失败,返回-1L,#include"stdio.h"main(){FILE*fp;charfilename[80];longlength;
gets(filename);
fp=fopen(filename,"rb");
if(fp==NULL)
printf("filenotfound!\n");else{fseek(fp,0L,SEEK_END);//位置指针移到末尾
lengt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营养师职业规划及试题及答案
- 备考2024年营养师试题与答案
- 演出经纪人资格证的综合性试题及答案
- 2024年营养师课程体系试题及答案
- 有效备考演出经纪人资格证的试题与答案
- 数字化转型对演出行业的影响试题及答案
- 演出经纪人资格证复习要点分析
- 演出经纪人资格证模拟考试试题及答案
- 房地产经纪人职业技能考核试题及答案
- 食品标签解读与营养学试题及答案
- DBJ∕T 15-19-2020 建筑防水工程技术规程
- 期末复习《《认识100以内的数》复习》(教案)2023-2024学年数学一年级下册
- 国家病案质控死亡病例自查表
- 2024年医师定期考核必刷题库附含参考答案
- 财富:2024年《财富》世界500 强排行榜
- 七年级数学人教版下册第五章平行线中常见作辅助线的技巧的九种类型课件
- 2024年内蒙古中考地理生物试卷
- 2024年高等教育文学类自考-09235设计原理(设计概论)笔试考试历年高频考点试题摘选含答案
- 2024年宁夏工业职业学院单招职业技能测试题库及一套参考答案
- 第21章 一元二次方程 复习课(第2课时) 教学设计
- 成人呼吸支持治疗器械相关压力性损伤理论考核试题
评论
0/150
提交评论