




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十章文件,C语言程序设计,18.05.2020,.,2,10.1C语言文件概述10.2缓冲文件输入输出系统10.3非缓冲文件输入输出系统,第10章文件,18.05.2020,.,3,10.1C语言文件概述,文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。,文件分类:按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)。流式文件:由一个个字符(字节)数据顺序组成。按存储介质:普通文件:存储介质文件(磁盘、磁带等)。设备文件:非存储介质(键盘、显示器、打印机等)。按数据的组织形式:ASCII文件(文本文件):每个字节存放ASCII码,表示一个字符。二进制文件:数据按其在内存中的存储形式原样存放。,10.1.1文件概述,18.05.2020,.,4,文本文件特点:存储量大,转换为二进制速度慢,直观易记。,二进制文件特点:存储量小,无需转换。但因一个字节不对应一个字符,故不能直接输出其字符形式。,18.05.2020,.,5,文件系统缓冲文件系统(高级文件系统):系统自动为正在使用的文件开辟内存缓冲区。非缓冲文件系统(低级文件系统):由用户在程序中为每个文件设定缓冲区。,10.1.2缓冲文件系统和非缓冲文件系统,18.05.2020,.,6,10.1.3标准输入输出库函数,在C语言编译系统中,由于计算机键盘输入和显示器的输出是使用最多的I/O操作,因此,C编译系统将键盘、显示器分别定义为标准的输入设备文件和标准的输出设备文件。在没有专门指定输入输出设备的情况下,所有的I/O操作均由键盘和显示器完成。,1.标准通用输入输出函数scanf():格式化输入函数。printf():格式化输出函数。,2.标准字符输入输出函数getche()、getchar()、getch()、putchar(),18.05.2020,.,7,1、getche()函数。(1)函数原型:intgetche(void);(2)功能:getche()函数的原型在conio.h中,它的功能是从键盘上读取一个字符并将该字符自动显示在屏幕上。getche()函数有两个变体,一个是getchar()函数,它是UNIX系统的字符输入函数的原形。另一个是getch()函数,它的功能和getche()基本一致,只是它不把读入的字符回显到屏幕上,可以利用这一特点来避免不必要的显示。(3)返回值:正常情况下其返回值是读到字符的ASCII码值,遇到文件结束或出错时,返回EOF。也可以通过标准输入设备换向功能从磁盘文件中读取字符的代码。,18.05.2020,.,8,【例10.1】把输入的小写字母变成大写字母输出,并统计字符个数。#includestdio.hmain()intch,count=0;while(ch=getchar()!=EOF)count+;if(ch=a,运行输入:Thestudentisaboy!运行结果:THESTUDENTISABOY!Thecharacterstotalto:21,18.05.2020,.,9,2、字符串输入输出函数gets()、puts()(1)gets()函数函数原型:char*gets(char*str);功能:接收来自标准输入的一个字符串,并把它放入str所指向的字符数组中。返回值:正常返回指向该字符串的指针,否则返回空指针NULL。gets()函数读取字符串的个数没有限制,编程时注意保证str所指向的字符数组应该有足够大的空间。它读到换行符或读入EOF时结束,EOF或换行符不放入字符串中而是将它们转换为空字符0,作为字符串的结束符,即自动转换成C语言的字符串。由于发生错误和读到文件结束标志这两种情况下返回值均为空指针,所以应该使用feof()函数和ferror()函数来区别两种不同的情况。,18.05.2020,.,10,【例10.2】读入一个字符串到字符数组中,并输出它的长度。#includestdio.hmain()charstr80;gets(str);printf(%dn,strlen(str);运行输入:howareyou运行结果:11,18.05.2020,.,11,(2)puts()函数函数原型:intputs(char*str);功能:将字符指针str所指的字符串输出到标准输出文件上,字符串结束符被转换成换行符。返回值:调用成功返回零,否则返回EOF。,【例10.3】将输入的字符串输出。#includestdio.hmain()charstr80;while(gets(str)!=NULL)puts(str);,18.05.2020,.,12,10.1.4标准设备文件及I/O改向,当输入一个字符或输出一个字符时,系统规定的设备分别为键盘和显示器,即所谓的标准输入、输出设备的名称。其实,一个程序运行时,系统首先自动打开五个标准文件,并为其分配了文件号。当程序运行结束时,系统又自动关闭这些标准设备,用户不能控制它们的打开与关闭。表10.1中列举了五个标准设备文件名及对应的文件号。,18.05.2020,.,13,【例10.4】从键盘上输入和向显示器上输出一个字符。/*文件名EXP8_4.c*/#includestdio.hmain()intc;while(c=getchar()!=EOF)putchar(c);,18.05.2020,.,14,1.输出改向例如,程序EXP8_4编译连接之后的可执行文件名为EXP8_4.EXE,则键入如下命令行:EXP8_4PRN将把标准输出文件从显示器改到打印机。执行程序时,从键盘输入的字符将不再输出到显示器,而是输出到打印机上打出。2.输入改向假设磁盘上存在一个名为data.txt的文本文件,则键入如下命令行:EXP8_4result.txt该命令行把标准输入改向到文件data.txt,把标准输出改向到文件result.txt。程序执行后,把文件data.txt的内容复制到文件result.txt中。,18.05.2020,.,15,10.2.1文件类型结构及文件指针10.2.2文件的打开与关闭10.2.3文件的读写10.2.4文件的定位10.2.5出错的检测,10.2缓冲型文件输入输出系统,缓冲型文件输入输出系统(高级磁盘输入输出系统/高级I/O):用缓冲文件系统进行的输入输出。,18.05.2020,.,16,10.2.1文件类型结构及文件指针文件类型结构体FILE缓冲文件系统为每个正使用的文件在内存开辟文件信息区。文件信息用系统定义的名为FILE的结构体描述。FILE定义在stdio.h中。,typedefstruct/*TurboC文件类型声明*/shortlevel;/*缓冲区满/空程度*/unsignedflags;/*文件状态标志*/charfd;/*文件描述符*/unsignedcharhold;/*若无缓冲区不读取字符*/shortbsize;/*缓冲区大小*/unsignedchar*buffer;/*数据传送缓冲区位置*/unsignedchar*curp;/*当前读写位置*/unsignedistemp;/*临时文件指示*/shorttoken;/*用作无效检测*/FILE;/*结构体类型名FILE*/,18.05.2020,.,17,文件指针定义形式FILE*文件结构指针名;用法:文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件。文件关闭后,它的文件结构体被释放。,FILE*fp;,18.05.2020,.,18,打开文件fopen函数首部:FILE*fopen(char*filename,char*mode)功能:按指定方式打开文件。返值:正常打开,为指向文件结构体的指针;打开失败,为NULL。,10.2.2文件的打开与关闭,要打开的文件名,使用文件方式,例:文件打开与测试。FILE*fp;if(fp=fopen(“filename”,“rb+”)=NULL)printf(“cannotopenthisfilen”);exit(0);,例FILE*fp;fp=fopen(“c:test”,”rb+”);,系统自动打开和关闭的五个标准设备文件:,18.05.2020,.,19,文件关闭fclose函数首部:intfclose(FILE*fp)功能:关闭fp指向的文件,释放文件结构体和文件指针。返值:正常为0;出错为非0。,文件打开时返回的文件类型指针,不关闭文件可能会丢失数据,18.05.2020,.,20,10.2.3文件的读写字符输出fputc函数原型:intfputc(intch,FILE*fp)功能:把一字符ch写入fp指向的文件中。返值:正常,返回ch;出错,为EOF。,字符输入fgetc函数原型:intfgetc(FILE*fp)功能:从fp指向的文件中读取一个字符。返值:正常,返回读取的字符;读到文件尾或出错时,为EOF。,文件I/O与终端I/O#defineputc(ch,fp)fputc(ch,fp)#definegetc(fp)fgetc(fp)#defineputchar(ch)fputc(ch,stdout)#definegetchar()fgetc(stdin),18.05.2020,.,21,例10.5从键盘输入一些字符,逐个把它们存到磁盘文件中,直到输入#“结束。,#includestdio.hmain()charch,filename20;FILE*fp;scanf(%s,filename);if(fp=fopen(filename,w)=NULL)printf(cannotopenthisfilen);exit(0);while(ch=getchar()!=#)fputc(ch,fp);putchar(ch);fclose(fp);,file1.txtComputerandC#,18.05.2020,.,22,例10.6将一个磁盘文件中的信息复制到另一个磁盘文件中,两个文件名由命令行参数给出。,#includestdio.hmain(argc,argv)intargc;char*argv;intch;FILE*fpr,*fpw;if(argc!=3)printf(youforgottoenterafilenamen);exit(0);if(fpr=fopen(argv1,r)=NULL)printf(File%scannotopenn,argv1);exit(0);if(fpw=fopen(argv2,w)=NULL)printf(FILE%scannotopenn,argv2);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。,18.05.2020,.,23,字符串输入fgets函数首部:char*fgets(char*str,intlength,FILE*fp);功能:从fp所指向的文件中,至多读length-1个字符,送入字符数组str中,如果在读入length-1个字符结束前遇换行符或EOF,读入即结束,字符串读入后在最后加一个0字符。返值:正常,返str指针;出错,返空指针NULL。,字符串输出fputs函数首部:intfputs(char*str,FILE*fp);功能:把str指向的字符串写入fp指向的文件。返值:正常,返0;出错返EOF。,18.05.2020,.,24,#includestdio.h#defineSIZE256main(argc,argv)intargc;char*argv;charchSIZE;intc,line;FILE*fp;if(argc!=2)printf(youforgottoenterafilemanen);exit(0);if(fp=fopen(argv1,r)=NULL)printf(File%scannotopenn,argv1);exit(0);line=1;while(fgets(ch,SIZE,fp)!=NULL)printf(%4dt%sn,line+,ch);fclose(fp);,例10.7读取文本文件的内容,并加上行号显示。,18.05.2020,.,25,字段输入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一般用于二进制文件的输入/输出。,18.05.2020,.,26,例floatf2;FILE*fp;fp=fopen(“aa.dat”,“rb”);fread(f,4,2,fp);,for(i=0;i2;i+)fread(,例structstudentintnum;charname20;charsex;intage;floatscore3;stud10;for(i=0;i10;i+)fread(,18.05.2020,.,27,例10.8从键盘输入4个学生数据,把他们转存到磁盘文件中去。,#include#defineSIZE4structstudent_typecharname10;intnum;intage;charaddr15;studSIZE;main()inti;for(i=0;iSIZE;i+)scanf(%s%d%d%s,,voidsave()FILE*fp;inti;if(fp=fopen(“c:stu_list,wb)=NULL)printf(cannotopenfilen);exit(0);for(i=0;iSIZE;i+)if(fwrite(,voiddisplay()FILE*fp;inti;if(fp=fopen(“c:stu_list,rb)=NULL)printf(cannotopenfilen);exit(0);for(i=0;i0向后移动0向前移动,起始点文件开始SEEK_SET0文件当前位置SEEK_CUR1文件末尾SEEK_END2,fseek(fp,100L,0);fseek(fp,-20L,SEEK_END);fseek(fp,50L,1);,18.05.2020,.,31,#includestructstudent_typeintnum;charname10;intage;charsex;stud10;main()inti;FILE*fp;if(fp=fopen(studd.dat,rb)=NULL)printf(cantopenfilen);exit(0);for(i=0;i10;i+=2)fseek(fp,i*sizeof(structstudent_type),0);fread(,例10.9磁盘文件stud.dat中存有10个学生数据,要求将第2,4,6,8,10个学生数据显示在屏幕上。,18.05.2020,.,32,10.2.5出错的检测ferror函数函数首部:intferror(FILE*fp);功能:检测fp所指文件的错误。返值:未出错,返0;出错,返非0。说明:(1)每次调用文件输入输出函数,均产生一个新的ferror函数值,所以应及时测试。(2)fopen打开文件时,ferror函数初值自动置为0。,18.05.2020,.,33,clearerr函数函数原型:voidclearerr(FILE*fp);功能:使fp所指文件错误标志和文件结束标志置为0。返值:无。说明:出错后,错误标志一直保留,直到对同一文件调clearerr()或rewind()函数,或任何其它一个输入输出函数。,例:ferror()与clearerr()举例。#includeintmain(void)FILE*stream;stream=fopen(DUMMY.FIL,w);getc(stream);if(ferror(stream)printf(ErrorreadingfromDUMMY.FILn);clearerr(stream);if(!ferror(stream)printf(Errorindicatorcleared!);fclose(stream);return0;,18.05.2020,.,34,10.3非缓冲型文件输入输出系统,非缓冲型输入输出系统又称为低级磁盘输入输出系统。在非缓冲文件系统中,系统不自动提供文件缓冲区,编程者必须自己提供和维护磁盘缓冲区;在非缓冲文件系统中也提供了一些输入输出函数,这些函数对文件的访问不是通过文件指针,而是用一个称为文件说明符的非零整数(类似于FORTRAN中的“文件号”)代表一个文件。非缓冲文件系统是基于UNIX的,ANSIC标准不包含这部分内容。鉴于实际工作中的情况,此处对非缓冲型文件做一些简单的介绍,并不提倡使用。,18.05.2020,.,35,1.open()函数函数原型:intopen(char*filename,intmode);功能:用于打开文件名为filename的文件,其中filename是任一有效文件名,mode表示打开文件的操作方式,下面是三个由fcntl.h中的宏定义之一,见表10.4。返回值:如果调用成功,函数返回一个正整数,文件指针置于开始处;如出错,函数返回-1。,【例10.10】只读方式打开文件。intfnum;if(fnum=open(stud.dat,0)=-1)printf(cannotopenthisfilen);exit(0);,18.05.2020,.,36,2.close()函数函数原型:intclose(intfd);功能:关闭fd所表示的文件,其中fd为整型变量,它是“文件说明符”(即文件号)。返回值:如果操作成功,函数返回0;否则返回-1。fd代表一个确定的文件,执行close()函数后,文件号释放,它不再与一个确定的文件相联系,但可以再被用来与另一个文件相联系。文件号是由系统在打开文件时确定的,并且系统规定了可以同时打开的最大文件数,而不是由程序设计者指定的。因此,凡不再使用的文件应及时用close()函数关闭。,18.05.2020,.,37,3.creat()函数函数原型:intcreat(char*filename,intmode);功能:创建一个由mode决定操作方式的名为filename的新文件。如果文件已经存在,则使文件中原来的内容全部丢失。返回值:如果操作成功,函数返回一个整数文件号;如果创建文件失败则返回-1。4.read()函数与write()函数(1)read()函数函数原型:intread(intfd,void*buf,intnum);功能:从文件说明符fd所关联的文件中读入num个字节到由buf所指的缓冲区中,可读的最大字节数为65534。返回值:如果操作成功,返回读入缓冲区的字节数,在文件结束时可能少于num个字节数;如果出错则返回-1。,18.05.2020,.,38,(2)write()函数函数原型:intwrite(intfd,void*buf,intnum);功能:写数据缓冲区buf的内容到fd相关联的文件中,写的长度为num个字节。返回值:如果操作成功,返回所写的字节数;否则返回-1。,【例10.11】从文件a1中读取前50个字节送到数组buf中,并将该字符串显示出来。#includestdio.h#includeio.hmain()intfd,i;charbuf50;if(fd=open(a1,0)=-1)printf(cannotopenthisfilen);exit(0);if(read(fd,buf,50)!=50)printf(possiblereaderror);for(i=0;i0)write(1,buf,n);exit(0);,18.05.2020,.,39,5.lseek()函数和随机访问在文件随机存取时用于移动文件指针,类似于缓冲文件系统中的fseek()函数。函数原型:longlseek(intfd,longoffset,intorigin);功能:按offset和origin的值,来设置由fd所表示的文件位置指针。其中offset为长整型数,表示偏移的字节数;o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 强化训练自考专业(小学教育)试题含答案(模拟题)
- 火电电力职业鉴定考前冲刺练习试题带答案详解(预热题)
- 2026届云南省巍山县化学九年级第一学期期末综合测试模拟试题含解析
- 星兴蓝天安全培训课件
- 2026届上海市文来中学化学九上期末监测试题含解析
- 口腔健康主题活动讲解
- 2026届四川省达州市开江县化学九年级第一学期期中经典模拟试题含解析
- 2026届抚顺市重点中学化学九上期中学业水平测试模拟试题含解析
- 高效煤粉锅炉安装指南
- 2026届莆田市重点中学九年级化学第一学期期中达标检测试题含解析
- 燃料电池催化剂研究报告
- 湖北省华大新高考联盟2026届高三上学期9月教学质量测评语文试题(含答案)
- 2025年化妆品代理合同范本模板
- 2025年江苏省农垦集团有限公司人员招聘笔试备考及参考答案详解
- 2025至2030年中国粗杂粮及粗杂粮加工行业市场调研分析及投资战略咨询报告
- 军用无人机讲解课件
- 2025年中国移动校园招聘笔试试题解析及答题技巧
- 长宏国际安全知识培训课件
- 2025-2026学年地质版(2024)小学体育与健康三年级(全一册)教学设计(附目录P123)
- 项目四旅游电子商务网络营销92课件
- 电缆桥架设备知识培训课件
评论
0/150
提交评论