您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > c语言基础课件11.文件操作
文件操作第十一章回顾为什么使用结构如何定义结构及初始化访问结构成员以及结构指针结构作为函数参数的用法本章目标了解文件分类熟悉流文件的概念理解文件指针掌握对文件的读写操作和字符串的输入输出了解在文件操作中应注意的几个问题本章结构文件分类文件操作文件指针流的概念对文件的操作文件操作中的问题C语言文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。文件分类:按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)。流式文件:由一个个字符(字节)数据顺序组成。按存储介质:普通文件:存储介质文件(磁盘、磁带等)。设备文件:非存储介质(键盘、显示器、打印机等)。按数据的组织形式:ASCII文件(文本文件):每个字节存放ASCII码,表示一个字符。二进制文件:数据按其在内存中的存储形式原样存放。例:整数100000010011100010000内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:存储量大,转换为二进制速度慢,直观易记。二进制文件特点:存储量小,无需转换。但因一个字节不对应一个字符,故不能直接输出其字符形式。文件系统缓冲文件系统(高级文件系统):系统自动为正在使用的文件开辟内存缓冲区。非缓冲文件系统(低级文件系统):由用户在程序中为每个文件设定缓冲区。磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统缓冲区指令区程序用户数据区磁盘文件非缓冲文件系统文件类型结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区。文件信息用系统定义的名为FILE的结构体描述。FILE定义在stdio.h中。typedefstruct{shortlevel;/*缓冲区满/空程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*若无缓冲区不读取字符*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据传送缓冲区位置*/unsignedchar*curp;/*当前读写位置*/unsignedistemp;/*临时文件指示*/shorttoken;/*用作无效检测*/}FILE;/*结构体类型名FILE*/文件类型结构及文件指针FILE*文件结构指针名;用法:文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。文件关闭后,它的文件结构体被释放。文件名文件使用方式文件类型指针C程序操作系统磁盘FILE*fp;文件指针定义形式打开文件fopen函数首部:FILE*fopen(char*filename,char*mode)功能:按指定方式打开文件。返值:正常打开,为指向文件结构体的指针;打开失败,为NULL。要打开的文件名使用文件方式例:文件打开与测试。FILE*fp;if((fp=fopen(“filename”,“rb+”))==NULL){printf(“cannotopenthisfile\n”);exit(0);}例FILE*fp;fp=fopen(“c:\\test“,“rb+“);“r+/rb+”(读写)“a/ab”(追加)“w/wb”(只写)“r/rb”(只读)“w+/wb+”(读写)“a+/ab+”(读写)为输入打开一个文本/二进制文件为输出打开或建立一个文本/二进制文件为读/写打开一个文本/二进制文件为读/写建立一个文本/二进制文件为读/写打开或建立一个文本/二进制文件向文本/二进制文件尾追加数据文件使用方式含义系统自动打开和关闭的五个标准设备文件:文件号文件指针标准文件0stdin标准输入(键盘)1stdout标准输出(显示器)2stderr标准错误(显示器)3stdaux标准辅助(辅助设备端口)4stdprn标准打印(打印机)文件的打开与关闭文件关闭fclose函数首部:intfclose(FILE*fp)功能:关闭fp指向的文件,释放文件结构体和文件指针。返值:正常为0;出错为非0。文件打开时返回的文件类型指针磁盘文件输出文件缓冲区输入文件缓冲区程序数据区a缓冲文件系统:fclose不关闭文件可能会丢失数据清除流清除流标准输入/输出是经过缓冲的。该函数用来清除缓冲区。如果打开文件进行读操作,该函数函数将清空文件的输入缓冲区;而打开文件进行写操作时,该函数将文件的输出缓冲区写入文件中。该函数的原型为:intfflush(FILE*fp);如果成功将返回0,否则返回EOF。字符输出fputc函数原型:intfputc(intch,FILE*fp)功能:把一字符ch写入fp指向的文件中。返值:正常,返回ch;出错,为EOF。字符输入fgetc函数原型:intfgetc(FILE*fp)功能:从fp指向的文件中读取一个字符。返值:正常,返回读取的字符;读到文件尾或出错时,为EOF。文件的读写例:从键盘输入一些字符,逐个把它们存到磁盘文件中,直到输入‘#“结束。#includestdio.hmain(){charch,filename[20];FILE*fp;scanf(%s,filename);if((fp=fopen(filename,w))==NULL){printf(cannotopenthisfile\n);exit(0);}while((ch=getchar())!='#'){fputc(ch,fp);putchar(ch);}fclose(fp);}键盘file1.txtComputerandC#例:将一个磁盘文件中的信息复制到另一个磁盘文件中,两个文件名由命令行参数给出。#includestdio.hmain(argc,argv)intargc;char*argv[];{intch;FILE*fpr,*fpw;if(argc!=3){printf(youforgottoenterafilename\n);exit(0);}if((fpr=fopen(argv[1],r))==NULL){printf(File%scannotopen\n,argv[1]);exit(0);}if((fpw=fopen(argv[2],w))==NULL){printf(FILE%scannotopen\n,argv[2]);exit(0);}while((ch=fgetc(fpr))!=EOF)fputc(ch,fpw);fclose(fpr);fclose(fpw);}C:s8_6file1.cfile2.c文件结束feof函数原型:intfeof(FILE*fp)功能:判断文件是否结束。返值:文件结束,返回真(非0);文件未结束,返回0。while(!feof(fpr))fputc(fgetc(fpr),fpw);“rb”“wb”字符串输入fgets函数首部:char*fgets(char*str,intlength,FILE*fp);功能:从fp所指向的文件中,至多读length-1个字符,送入字符数组str中,如果在读入length-1个字符结束前遇换行符或EOF,读入即结束,字符串读入后在最后加一个‘\0’字符。返值:正常,返str指针;出错,返空指针NULL。字符串输出fputs函数首部:int*fputs(char*str,FILE*fp);功能:把str指向的字符串写入fp指向的文件。返值:正常,返0;出错返EOF。字符串输入输出#includestdio.h#defineSIZE256main(argc,argv)intargc;char*argv[];{charch[SIZE];intc,line;FILE*fp;if(argc!=2){printf(youforgottoenterafilemane\n);exit(0);}if((fp=fopen(argv[1],r))==NULL){printf(File%scannotopen\n,argv[1]);exit(0);}line=1;while(fgets(ch,SIZE,fp)!=NULL)printf(%4d\t%s\n,line++,ch);fclose(fp);}例:读取文本文件的内容,并加上行号显示。字段输入fread/输出fwrite函数首部:–intfread(void*buffer,intnum_bytes,intcount,FILE*fp);–intfwrite(void*buffer,intnum_bytes,intcount,FILE*fp);功能:读/写数据块。返值:成功,返回读/写的字段数;出错或文件结束,返回0。说明:buffer:指向要输入/输出数据存储区的首地址的指针num_bytes:每个要读/写的字段的字节数count:要读/写的字段的个数fp:要读/写的文件指针fread与fwrite一般用于二进制文件的输入/输出。例floatf[2];FILE*fp;fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);for(i=0;i2;i++)fread(&f[i],4,1,fp);例structstudent{intnum;charname[20];charsex;intage;floatscore[3];}stud[10];for(i=0;i10;i++)fread(&stud[i],sizeof(structstudent),1,fp);从键盘输入4个学生数据,把他们转存到磁盘文件中去。#includestdio.h#defineSIZE4structstudent_type{charname[10];intnum;intage;charaddr[15];}stud[SIZE];main(){inti;for(i=0;iSIZE;i++)scanf(%s%d%d%s,stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);save();display();}voidsave(){FILE*fp;inti;if((fp=fopen(“c:\\stu_list,wb))==NULL){printf(cannotopenfile\n);exit(0);}for(i=0;iSIZE;i++)if(fwrite(&stud[i],sizeof(structstudent_type),1,fp)!=1)printf(filewriteerror\n);fclose(fp);}voiddisplay(){FILE*fp;inti;if((fp=fopen(“c:\\stu_list,rb))==NULL){printf(cannotopenfile\n);exit(0);}for(i=0;iSIZE;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);}zhang100119room-101fun100220room-102tan100321room-103ling100421room-104格式化输入fscanf/输出fprintf函数首部:•intfscanf(FILE*fp,char*format,arg_list);•intfprintf(FILE*fp,constchar*format,arg_list);功能:按format格式对fp指向的文件进行I/O操作。返值:成功,返回I/O的个数;出错或文件尾,返回EOF。例fscanf(fp,“%d%f”,&i,&f);//若文件中有3,4.5,则将3
本文标题:c语言基础课件11.文件操作
链接地址:https://www.777doc.com/doc-3379176 .html