《c语言程序设计现代方法.pptx》由会员分享,可在线阅读,更多相关《c语言程序设计现代方法.pptx(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 C文件概述文件:存储在外部介质上数据的集合,是操作系统数据管理的单位。使用数据文件的目的:使用数据文件的目的:1、数据文件的改动不引起程序的改动、数据文件的改动不引起程序的改动程序与程序与 数据分离;数据分离;2、不同程序可以访问同一数据文件中的数据、不同程序可以访问同一数据文件中的数据数据共享;数据共享;3、能、能长期保存长期保存程序运行的中间数据或结果数据。程序运行的中间数据或结果数据。第1页/共21页 文件分类文件分类按文件的逻辑结构:记录文件:由具有一定结构的记录组成(定长和不定长)流式文件:由一个个字符(字节)数据顺序组成按存储介质:普通文件:存储介质文件(磁盘、磁带等)设备文件
2、:非存储介质(键盘、显示器、打印机等)按数据的组织形式:文本文件:ASCII文件,每个字节存放一个字符的ASCII码二进制文件:数据按其在内存中的存储形式原样存放第2页/共21页 EOF文件的结束符:C语言中规定的标准文件有三个:标准输入文件(键盘),文件指针为stdin;标准输出文件(显示屏幕),文件指针为stdout;标准出错输出文件,文件指针为stderr。C语言中的文件为流式文件一个字节流或二进制流。文件的读写是按顺序进行的,以字符(字节)为单位。这些文件在操作前或后,系统会自动将其打开或关闭,编程时不需管。第3页/共21页如:如:int型数型数10000001001110001000
3、0内存存储形式0010011100010000二进制形式0011000100110000001100000011000000110000ASCII形式文本文件特点:存储量大、速度慢、便于对字符操作二进制文件特点:存储量小、速度快、便于存放中间结果,可节省外存空间和转换时间但不能直接输出字符第4页/共21页 文件处理方法文件处理方法缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区磁盘文件磁盘文件输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区程序数据区程序数据区a缓冲文件系统:缓冲文件系统:缓冲区缓冲区指令
4、区指令区程序程序用户数据区用户数据区磁盘磁盘非缓冲文件系统:非缓冲文件系统:第5页/共21页2 文件类型指针文件结构FILE 缓冲文件系统为每个正使用的文件在内存开辟文件信息区文件信息用系统定义的名为FILE的结构描述FILE定义在stdio.h中typedef struct int _fd;/*文件号文件号*/int _cleft;/*缓冲区中剩下的字符数缓冲区中剩下的字符数*/int _mode;/*文件操作方式文件操作方式*/char *_next;/*文件当前读写位置文件当前读写位置*/char *_buff;/*文件缓冲区位置文件缓冲区位置*/FILE;第6页/共21页文件类型指针指
5、针变量说明:FILE *fp;用法:文件打开时,系统自动建立文件结构,并把指向它的指针返回来,程序通过这个指针获得文件信息,访问文件文件关闭后,它的文件结构被释放文件名文件名文件使用文件使用方式方式文件类型指针文件类型指针C程序程序操作系统操作系统磁盘磁盘第7页/共21页3 文件的打开与关闭v一般文件:操作前需打开,操作后需关闭。打开和关闭均是通过库函数进行的。v打开文件就是要在内存中建立缓冲区,如打开成功,打开函数返回一个内存地址值,由一个文件指针接收。以后的操作使用这个指针。若内存不可建立缓冲区,则打开失败,打开函数返回NULL。v关闭文件很重要,是要将文件送回磁盘,并从内存中清除。及时释
6、放内存空间,并可保证文件安全。v文件使用方式:打开文件-文件读/写-关闭文件第8页/共21页打开文件fopen函数原型:FILE *fopen(char*name,char*mode);n功能:按指定方式打开文件n返值:正常打开,为指向文件结构的指针;打开失败,为NULL要打开的文件名要打开的文件名使用文件方式使用文件方式例例 FILE *fp;fp=fopen(“c:pytest.dat”,”r”);例例 FILE *fp;char *filename=“c:pytest.dat”fp=fopen(filename,”r”);“r+/rb+”(读写读写)“a/ab”(追加追加)“w/wb”(
7、只写只写)“r/rb”(只读只读)“w+/wb+”(读写读写)“a+/ab+”(读写读写)为为输入输入打开一个文本打开一个文本/二进制文件二进制文件为为输出输出打开或建立一个文本打开或建立一个文本/二进制文件二进制文件为读为读/写打开一个文本写打开一个文本/二进制文件二进制文件为读为读/写建立一个文本写建立一个文本/二进制文件二进制文件为读为读/写打开或建立一个文本写打开或建立一个文本/二进制文件二进制文件向文本向文本/二进制文件尾二进制文件尾追加追加数据数据文件使用方式文件使用方式含义含义第9页/共21页文件关闭fclose函数原型:int fclose(FILE *fp);n功能:关闭fp
8、指向的文件,使文件指针变量与文件“脱钩”,释放文件结构占用的内存空间n返值:正常关闭为0;出错时,非0文件打开时返回的文件指针文件打开时返回的文件指针磁盘文件磁盘文件输出文件缓冲区输出文件缓冲区输入文件缓冲区输入文件缓冲区程序数据区程序数据区a缓冲文件系统:缓冲文件系统:fclose不关闭文件可能会不关闭文件可能会丢失数据丢失数据第10页/共21页4 文件的读写字符I/O:fputc与fgetcfputc函数原型:int fputc(char c,FILE*fp);功能:把一字节代码c写入fp指向的文件中返值:正常,返回c;出错,返回非0fgetc函数原型:int fgetc(FILE*fp)
9、;功能:从fp指向的文件中读取一字节代码返值:正常,返回读到的字符;读到文件尾或出错,为EOF第11页/共21页例:从键盘输入字符,例:从键盘输入字符,逐个存到磁盘文件中,逐个存到磁盘文件中,直到输入直到输入#“为止。为止。#include main()FILE*fp;char ch,*filename=“out.txt”;if(fp=fopen(filename,w)=NULL)printf(cannot open filen);exit(0);printf(Please input string:);ch=getchar();while(ch!=#)fputc(ch,fp);putchar
10、(ch);ch=getchar();fclose(fp);例:读文本文件内容,例:读文本文件内容,并显示。并显示。#include main()FILE*fp;char ch,*filename=“out.txt”;if(fp=fopen(filename,”r)=NULL)printf(cannot open filen);exit(0);while(ch=fgetc(fp)!=EOF)putchar(ch);fclose(fp);判断判断文本文件文本文件是否结束是否结束第12页/共21页例:使用文件处理函数,以及命令行参数,实现拷贝任何类例:使用文件处理函数,以及命令行参数,实现拷贝任何类
11、型的文件。型的文件。#include main(int argc,char*argv)FILE*in,*out;char ch;if(argc!=3)printf(”Usage:source filename and target filename”);exit(1);if(in=fopen(argv1,”rb”)=NULL)printf(”Can not open source filen”);exit(1);if(out=fopen(argv2,”wb”)=NULL)printf(”Can not open target filen”);exit(1);while(!feof(in)/*T
12、his code actually copies the file*/ch=fgetc(in);fputc(ch,out);fclose(in);fclose(out);运行运行:c:test ctemp newfile 第13页/共21页n字符串I/O:fgets与fputsn函数原型:char *fgets(char*s,int n,FILE*fp);int fputs(char *s,FILE *fp);n功能:从fp指向的文件读/写一个字符串n返值:nfgets正常时返回读取字符串的首地址;出错或文件尾,返回NULLnfputs正常时返回0;出错返回非0nfeofn函数原型:int f
13、eof(FILE *fp);n功能:判断文件是否结束n返值:文件结束,返回真(非0);文件未结束,返回0第14页/共21页数据块I/O:fread与fwrite函数原型:size_t fread(void*buffer,size_t size,size_t count,FILE *fp);size_t fwrite(void*buffer,size_t size,size_t count,FILE *fp);n功能:读/写数据块。成功,返回读/写的块数;出错或文件尾,返回0n说明:ntypedef unsigned size_t;nbuffer:指向要输入/输出数据块的首地址的指针nsize:
14、每个要读/写的数据块的大小(字节数)ncount:要读/写的数据块的个数nfp:要读/写的文件指针nfread与fwrite 一般用于二进制文件的输入/输出第15页/共21页例:从键盘输入例:从键盘输入4个学生数据,先转存到磁盘文件再读出显示个学生数据,先转存到磁盘文件再读出显示#include#define SIZE 4struct student_type char name10;int num;int age;char addr15;studSIZE;main()int i;for(i=0;iSIZE;i+)scanf(%s%d%d%s,studi.name,&studi.num,&st
15、udi.age,studi.addr);save();display();void save()FILE*fp;int i;if(fp=fopen(d:pystu_dat,wb)=NULL)printf(cannot open filen);return;for(i=0;iSIZE;i+)if(fwrite(&studi,sizeof(struct student_type),1,fp)!=1)printf(file write errorn);fclose(fp);void display()FILE*fp;int i;if(fp=fopen(d:pystu_dat,rb)=NULL)pri
16、ntf(cannot open filen);return;for(i=0;iSIZE;i+)fread(&studi,sizeof(struct student_type),1,fp);printf(%-10s%4d%4d%-15sn,studi.name,studi.num,studi.age,studi.addr);fclose(fp);第16页/共21页格式化I/O:fprintf与fscanf函数原型:int fprintf(FILE*fp,const char*format,argument,);int fscanf(FILE*fp,const char*format,addres
17、s,);n功能:按格式对文件进行I/O操作n返值:成功,返回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*/第17页/共21页例:从键盘按格式输入数据存到磁盘文件中,从磁盘文件按格式输入数据并显示。#include main()char s80,c80;int a,b;FILE*fp;if(fp=fopen(test,w)=NULL)puts(
18、cant open file);exit;fscanf(stdin,%s%d,s,&a);/*read fromkeyboard*/fprintf(fp,%s%d,s,a);/*write to file*/fclose(fp);if(fp=fopen(test,r)=NULL)puts(cant open file);exit;fscanf(fp,%s%d,c,&b);/*read from file*/fprintf(stdout,%s%d,c,b);/*print to screen*/fclose(fp);第18页/共21页9.5 其他文件操作函数文件位置指针-指向当前读写位置的指针读
19、写方式顺序读写:位置指针按字节位置顺序移动随机读写:位置指针按需要移动到任意位置rewind函数函数原型:void rewind(FILE *fp);功能:重置文件位置指针到文件开头返值:无fseek函数函数原型:int fseek(FILE*fp,long offset,int whence);功能:改变文件位置指针的位置返值:成功,返回0;失败,返回非0值。ferror函数函数原型:int ferror(FILE *fp);功能:测试文件操作是否出现错误返值:未出错,0;出错,非0第19页/共21页小结系统把文件当作一个“流”,按字节进行处理。文件按编码方式分为二进制文件和ASCII文件。语言中,用文件指针标识文件,当一个文件被 打开时,取得该文件指针。文件在读写之前必须打开,读写结束必须关闭。文件可按只读、只写、读写、追加四种操作方式打开,同时还必须指定文件的类型是二进制文件还是文本文件。文件可按字节,字符串,数据块为单位读写,文件也可按指定的格式进行读写。文件内部的位置指针可指示当前的读写位置,移动该指针可以对文件实现随机读写。第20页/共21页感谢您的欣赏!第21页/共21页
限制150内