资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
关于 FILE 指针 使用语言文件系统称为流文件(Stream) ,正文流(正文文件) ,二进制流(二进制文件)缓冲与非缓冲文件顺序操作文件与随机操作文件顺序文件:读/写第 K 个数据块之前必须读/写第1至 K-1个数据块;随机文件:可直接读/写第 K 个数据块;正文文件的操作一般是顺序文件;二进制文件的操作都是随机文件。一、文件操作的一般过程定义文件指针 FILE *打开文件 fopen对文件进行读写二、系统已定义的与文件操作有关的数据结构全都在 stdio.h 中 FILE 结构体FILE *fr,*fp,*fw;FILE* 指针作为文件句柄,是文件访问的唯一标识,它由 fopen 函数创建,fopen 打开文件成功,则返回一个有效的 FILE*指针,否则返回空指针 NULL 标准文件指针FILE *stdin,*stdout,*stderr,stdin 指键盘输入stdout 指显示器stderr 指出错输出设备,也指显示器这些变量已成功初始化,可直接使用.三、常用操作函数 fopen 格式:FILE *fopen(文件名字符串,打开方式串) 例:FILE *fr; fr=fopen(c:userabc.txt,r); 字符串操作: 1)r或rt:正文文件只读方式打开。文件不存在,则打开失败( 顺序读)w或wt:正文文件只写方式打开。若文件不存在,则建立文件;若文件存在,则删除文件内容,重建空文件(顺序写) ;(截取文件长度为0) 2) a或at:正文文件添加方式。文件不存在,则建立文件( 顺序添加写) 3) r+或rt+:正文文件读写打开,文件不存在,则打开失败(顺序读/ 写、随机读/写,含改写与添加); 4) w+或w+:正文文件读写方式打开,文件不存在,则建立文件;否则截取文件长度为0(顺序读/写,随机读/写,对写入的内容可以读或改写或添加) 5) b:正文文件二进制文件 顺序读顺序/随机读(“ rb”) eg:r或rtrb 顺序写(wb) 顺序添加写(ab) 顺.,随.,含.(rb+) 顺.,添加 (wb+) 顺.,添加 (ab+) 使用 fopen 时,但凡含 r 字母的打开方式,一定要加判断,文件是否打开成功,否则程序不会报告错误,会运行下去。 如:FILE *fr; fr=fopen(abc.txt,r); if(fr=NULL) printf(File not open!n); return; /*或 exit(1);*/ 文件关闭fclose(FILE *fp)一般地,fclose(fp)与 fopen 应配对使用,特别是含有写方式的文件,若不关闭会造成文件数据丢失。fcloseall(void):关闭当前所有打开的文件。 单字节的输入函数可适用于二进制与正文文件操作int fgetc(FILE *fp)int fputc(char ch.FILE *fp)fgetc 的返回值都是正数(0255)文件无可读字节则返回-1 (EOF)正文文件与二进制文件读写的区别:正文文件读到13 10时,将自动跳过13,读出10并返回;正文文件写入10 时,首先自动写入13再写入 10. 文件指针与文件指针操作函数文件指针是文件操作系统数据结构内部的一种数据指针,它用于标注文件当前读写位置,C 语言中,文件指针以字节为单位,文件第一个字节位置号为0,若文件长度为 N 个字节,则最后一个字节的位置号为 N-1,长度为 N 字节的文件有效读写范围为 0N-1 。指针位置在此之外进行读/写操作,则失败;读写函数返回-1(EOF) ;C 语言的文件指针采用 long 型值;执行文件读/写操作后,文件指针自动向后移动,指到新的待读/写位置。文件指针移动函数rewind(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 为文件长度 文件指针的特性:可在“负无穷 ”到“正无穷” 任意移动;在0N-1之外进行读操作,则读失败;读失败后,feof 函数为真;从 N 位置开始写入,则为添加;从0N 位置之外开始写也可,其行为不必掌握,因为几乎无用;无论任何方式,刚打开文件时,ftell 函数返回值都是0 ,含 a 方式的文件,只要一写(第一次写) ,文件指针自动移动到 N 位置处。int feof(FILE *fp)若文件读失败,则返回非0值,否则返回 0值;仅用于读是否到文件尾。任何 fseek 操作使 feof 为假,即使文件指针在 0N-1 之外。 正文文件读/写函数fscanf(fp.)fprintf(fp.)其中,.与 scanf 和 printf 用法完全相同.scanf(.)fscanf(stdin.)printf(.)fprintf(stdout.) 二进制文件读/写函数,即字节块函数int fread(char *buf,int size,int count,FILE *fp)int fwrite(char *buf,intsize,int count,FILE *fp)从文件读出 size x count 个字节到内存块 buf;从内存块 buf 写入 size x count 个字节到文件,返回实际读出/写入的字节数。一、文件中删除第 K 个记录:拷贝0K-1,K+1N 条记录到一个临时文件,删除源文件,将源文件改名为源文件。二、读/改写第 K 个记录:移动指针到第 K 个记录,用 fread,fwrite 改写。三、添加记录(略)四、插入记录 复制临时文件插入到 K 号记录之前:先将 N-1写入 N 位置,N-2 写入 N-1,直到 K 写入 K+1位置:用待插入记录改写 K 位置。 (建立时用 rb+方式打开) #include tdio.hvoid 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)printf(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;fclose(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; /* 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 */ FILE; /* This is the FILE object */FILE 这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表 函数 功能fopen() 打开流fclose() 关闭流fputc() 写一个字符到流中fgetc() 从流中读一个字符fseek() 在流中定位到指定的字符fputs() 写字符串到流fgets() 从流中读一行或指定个字符fprintf() 按格式输出到流fscanf() 从流中按格式读取feof() 到达文件尾时返回真值ferror() 发生错误时返回其值rewind() 复位文件定位器到文件开始处remove() 删除文件fread() 从流中读指定个数的字符fwrite() 向流中写指定个数的字符tmpfile() 生成一个临时文件流tmpnam() 生成一个唯一的文件名下面就介绍一下这些函数1.fopen()fopen 的原型是:FILE *fopen(const char *filename,const char *mode),fopen 实现三个功能为使用而打开一个流把一个文件和此流相连接给此流返回一个 FILR 指针参数 filename 指向要打开的文件名,mode 表示打开状态的字符串,其取值如下表字符串 含义r 以只读方式打开文件w 以只写方式打开文件a 以追加方式打开文件r+ 以读 /写方式打开文件,如无文件出错w+ 以读/ 写方式打开文件,如无文件生成新文件一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符n,而二进制模式认为它是两个字符0x0D,0x0A ;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。系统默认的是以文本模式打开,可以修改全部变量_fmode 的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。我们也可以在模式字符串中指定打开的模式,如rb 表示以二进制模式打开只读文件, w+t或wt+表示以文本模式打开读/写文件。此函数返回一个 FILE 指针,所以申明一个 FILE 指针后不用初始化,而是用 fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回 NULL。例:FILE *fp;if(fp=fopen(123.456,wb)puts(打开文件成功);elseputs(打开文件成败);2.fclose()fclose()的功能就是关闭用 fopen()打开的文件,其原型是: int fclose(FILE *fp);如果成功,返回nt
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号