版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、关于FILE指针 使用语言文件系统称为流文件(Stream),正文流(正文文件),二进制流(二进制文件)缓冲与非缓冲文件顺序操作文件与随机操作文件顺序文件:读/写第K个数据块之前必须读/写第1至K-1个数据块;随机文件:可直接读/写第K个数据块;正文文件的操作一般是顺序文件;二进制文件的操作都是随机文件。一、文件操作的一般过程定义文件指针 FILE *打开文件 fopen对文件进行读写二、系统已定义的与文件操作有关的数据结构全都在stdio.h中1 FILE 结构体 FILE *fr,*fp,*fw;FILE* 指针作为文件句柄,是文件访问的唯一标识,它由fopen函数创建,fopen打开文件
2、成功,则返回一个有效的FILE*指针,否则返回空指针NULL2 标准文件指针 FILE *stdin,*stdout,*stderr, stdin 指键盘输入 stdout 指显示器 stderr 指出错输出设备,也指显示器这些变量已成功初始化,可直接使用.三、常用操作函数3 fopen 格式:FILE *fopen(文件名字符串,打开方式串) 例:FILE *fr; fr=fopen("c:userabc.txt","r"); 字符串操作: 1)"r"或"rt":正文文件只读方式打开。文件不存在,则打开失败(顺序
3、读)"w"或"wt":正文文件只写方式打开。若文件不存在,则建立文件;若文件存在,则删除文件内容,重建空文件(顺序写);(截取文件长度为0) 2) "a"或"at":正文文件添加方式。文件不存在,则建立文件(顺序添加写) 3) "r+"或"rt+":正文文件读写打开,文件不存在,则打开失败(顺序读/写、随机读/写,含改写与添加); 4) "w+"或"w+":正文文件读写方式打开,文件不存在,则建立文件;否则截取文件长度为0(顺序读/写,
4、随机读/写,对写入的内容可以读或改写或添加) 5) b:正文文件二进制文件 顺序读顺序/随机读(“rb”) eg:"r"或"rt""rb" 顺序写("wb") 顺序添加写("ab") 顺.,随.,含.("rb+") 顺.,添加("wb+") 顺.,添加("ab+") 使用fopen时,但凡含r字母的打开方式,一定要加判断,文件是否打开成功,否则程序不会报告错误,会运行下去。 如:FILE *fr; fr=fopen("abc.
5、txt","r"); if(fr=NULL) printf("File not open!n"); return; /*或exit(1);*/ 4 文件关闭fclose(FILE *fp)一般地,fclose(fp)与fopen应配对使用,特别是含有写方式的文件,若不关闭会造成文件数据丢失。fcloseall(void):关闭当前所有打开的文件。5 单字节的输入函数可适用于二进制与正文文件操作int fgetc(FILE *fp) int fputc(char ch.FILE *fp)fgetc的返回值都是正数(0255)文件无可读字节则返回-
6、1(EOF)正文文件与二进制文件读写的区别:正文文件读到13 10时,将自动跳过13,读出10并返回;正文文件写入10时,首先自动写入13再写入10.6 文件指针与文件指针操作函数文件指针是文件操作系统数据结构内部的一种数据指针,它用于标注文件当前读写位置,C语言中,文件指针以字节为单位,文件第一个字节位置号为0,若文件长度为N个字节,则最后一个字节的位置号为N-1,长度为N字节的文件有效读写范围为0N-1。指针位置在此之外进行读/写操作,则失败;读写函数返回-1(EOF);C语言的文件指针采用long型值;执行文件读/写操作后,文件指针自动向后移动,指到新的待读/写位置。文件指针移动函数re
7、wind(FILE *fp)文件指针重置为0fseek(FILE *fp,long off,int pos) 从pos位置开始,移动off个字节。pos: 0 文件开始 1 文件当前指针位置 2 文件结尾(文件长度为N,则指针位置为N)例:fseek(fp,0l,0);rewind(fp)fseek(fp,-1L,2); /*移动指针到最后一个字节*/fseek(fp,-2L,1); /*移动指针到当前位置的前两个位置*/long ftell(FILE *fp)求当前指针位置例:求文件长度fseek(fp,OL,2);len=ftell(fp);则len为文件长度 文件指针的特性:可在“负无穷
8、”到“正无穷”任意移动;在0N-1之外进行读操作,则读失败;读失败后,feof函数为真;从N位置开始写入,则为添加;从0N位置之外开始写也可,其行为不必掌握,因为几乎无用;无论任何方式,刚打开文件时,ftell函数返回值都是0,含a方式的文件,只要一写(第一次写),文件指针自动移动到N位置处。int feof(FILE *fp)若文件读失败,则返回非0值,否则返回0值;仅用于读是否到文件尾。任何fseek操作使feof为假,即使文件指针在0N-1之外。7 正文文件读/写函数fscanf(fp.) fprintf(fp.)其中,.与scanf和printf用法完全相同.scanf(.)fscan
9、f(stdin.)printf(.)fprintf(stdout.)8 二进制文件读/写函数,即字节块函数int fread(char *buf,int size,int count,FILE *fp) int fwrite(char *buf,int&nbtp;size,int count,FILE *fp)从文件读出size x count个字节到内存块buf;从内存块buf写入size x count个字节到文件,返回实际读出/写入的字节数。一、文件中删除第K个记录:拷贝0K-1,K+1N条记录到一个临时文件,删除源文件,将源文件改名为源文件。二、读/改写第K个记录:移动指针到第
10、K个记录,用fread,fwrite改写。三、添加记录(略)四、插入记录9 复制临时文件插入到K号记录之前:先将N-1写入N位置,N-2写入N-1,直到K写入K+1位置:用待插入记录改写K位置。(建立时用rb+方式打开) #include "tdio.h"void main()FILE *fp;char ch1,ch2;long pos1,pos2,p;char fname81;printf("Input C source filename:");gets(fname);fp=fopen(fname,"r+");if(!fp)prin
11、tf("FILE not found .n); return;ch1=fgetc(fp);while(!feof(fp)cha2=fgetc(fp);if(feof(fp) break;if(ch1='/'&&ch2='*')pos1=ftell(fp)-2;if(ch1='*'&&ch='/')pos2=ftell(fp)-1;fseek(fp,pos1,0);for(p=pos1;p<=pos2;p+) fputc(32,fp);fseek(fp,OL,1);ch1=ch2;fc
12、lose(fp);发表于 2006-12-23 17:39 (LEYN)顽主 阅读(8786) 评论(1) 编辑 收藏 引用评论#re: 关于FILE指针 使用 回复 更多评论 基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedef struct int level; /* fill/empty level of buffer */unsigned flags; /* File status flags */char fd; /*
13、 File descriptor */unsigned char hold; /* Ungetc char if no buffer */int bsize; /* Buffer size */unsigned char _FAR *buffer; /* Data transfer buffer */unsigned char _FAR *curp; /* Current active pointer */unsigned istemp; /* Temporary file indicator */short token; /* Used for validity checking */ FI
14、LE; /* This is the FILE object */FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能fopen() 打开流fclose() 关闭流fputc() 写一个字符到流中fgetc() 从流中读一个字符fseek() 在流中定位到指定的字符fputs() 写字符串到流fgets() 从流中读一行或指定个字符fprintf() 按格式输出到流fscanf() 从流中按格式读取feof() 到达文件尾时返回真值ferror() 发生错误时返回其值rewind() 复位文件定位器到文件开始处remove
15、() 删除文件fread() 从流中读指定个数的字符fwrite() 向流中写指定个数的字符tmpfile() 生成一个临时文件流tmpnam() 生成一个唯一的文件名下面就介绍一下这些函数1.fopen()fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能为使用而打开一个流把一个文件和此流相连接给此流返回一个FILR指针参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表字符串 含义"r" 以只读方式打开文件"w" 以只写方式打开
16、文件"a" 以追加方式打开文件"r+" 以读/写方式打开文件,如无文件出错"w+" 以读/写方式打开文件,如无文件生成新文件一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。系统默认的是以文本模式打开,可以修改全部变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开
17、方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。例:FILE *fp;if(fp=fopen("123.456","wb")puts("打开文件成功");elsepu
18、ts("打开文件成败");2.fclose()fclose()的功能就是关闭用fopen()打开的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失败返回EOF。在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况,我以前就经常犯这样的毛病。例:fclose(fp);3.fputc()向流写一个字符,原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。例:fputc('X',fp);4.fgetc()从流中读一个字符,原型是int fputc(FILE *strea
19、m); 成功返回这个字符,失败返回EOF。例:char ch1=fgetc(fp);5. fseek()此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是符号常量 值 基准位置SEEK_SET 0 文件开头SEEK_CUR 1 当前读写的位置SEEK_END 2 文件尾部例:fseek(fp,1234L,SEEK_CUR);/把读写位置从当前位置向后移动1234字节(L后缀表示长整数)fseek(
20、fp,0L,2);/把读写位置移动到文件尾6.fputs()写一个字符串到流中,原型int fputs(const char *s, FILE *stream);例:fputs("I Love You",fp);7.fgets()从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。例:如果一个文件的当前位置的文本如下Love ,I HaveBut .如果用fgets(str1,4,file1);则执行后str
21、1="Lov",读取了4-1=3个字符,而如果用fgets(str1,23,file1);则执行str="Love ,I Have",读取了一行(不包括行尾的'n')。8.fprintf()按格式输入到流,其原型是int fprintf(FILE *stream, const char *format, argument, .);其用法和printf()相同,不过不是写到控制台,而是写到流罢了例:fprintf(fp,"%2d%s",4,"Hahaha");9.fscanf()从流中按格式读取,其原
22、型是int fscanf(FILE *stream, const char *format, address, .);其用法和scanf()相同,不过不是从控制台读取,而是从流读取罢了。例:fscanf(fp,"%d%d" ,&x,&y);10.feof()检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);例:if(feof(fp)printf("已到文件尾");11.ferror()原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它
23、,clearerr()的原型是void clearerr(FILE *stream);例:printf("%d",ferror(fp);12.rewind()把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);例:rewind(fp);12.remove()删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。例:remove("c:io.sys");13.fread()从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *strea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理健康责任制度
- 总经理强调安全责任制度
- 户口窗口首问责任制度
- 托幼管理所安全责任制度
- 技术人员工作责任制度
- 护士分级责任制度
- 押运员工作责任制度
- 指接板厂生产责任制度
- 控辍保学村责任制度
- 操作员安全责任制度范本
- 食品厂抽样规范制度
- 2025年通信基站安全管理与应急处理规范
- 2026年及未来5年市场数据中国水雾化铁粉行业深度分析及投资规划研究建议报告
- GB/T 20417.2-2025塑料丙烯腈-丁二烯-苯乙烯(ABS)模塑和挤出材料第2部分:试样制备和性能测定
- 河南开封事业单位公开招聘试题含答案2025年
- 《新型分离技术》课件-02分离过程的基础理论
- 2025年安徽中澳科技职业学院单招职业倾向性考试题库带答案解析
- 《比例的意义》数学课件教学教案
- 脑梗塞的症状及前兆课件
- 医学伦理知情同意书
- 等和线定理课件
评论
0/150
提交评论