设为首页 加入收藏

TOP

C语言文件操作(FILE)与常用文件操作函数(二)
2019-08-13 05:39:24 】 浏览:123
Tags:语言 文件 操作 FILE 常用 函数
t型,但只写入低字节)


  函数功能:该函数的功能是将字符c写到文件指针fp所指的文件上中,若写入错误返回EOF,否则返回字符c


 


  文件的定位


  文件的随机读写:文件的随机访问允许在文件中随机定位,并在文件的任何位置直接读写数据,为了实现文件的定位,在每一个打开的文件中,都有一个文件位置指针,


  也称为文件位置标记,用来指向当前读写文件的位置,它保存了文件中的位置信息,当文件进行顺序读写时,每读完一个字节后,该位置指针自动移到下一个字节的位置,


  当需要随机读写文件数据时,则需强制移动文件位置指针指向特定的位置


 


  fseek()函数


  函数原型:int fseek(FILE *fp,long offset,int fromwhere);


  函数功能:将fp的文件位置指针从fromwhere开始移动offset个字节指示下一个要读取的数据的位置


  offset是一个偏移量,它告诉文件位置指针要跳过多少字节,offset为正时,向后移动,为负时,向前移动,ANSIC要求位移量offset是长整型数据(常量数据后要加L),


  这样当文件的长度大于64k时不至于出问题


  fromwhere用于确定偏移量计算的起始位置,它的可能取值有3种,SEEK_SET或0,代表文件开始处,SEEK_CUR或1,代表文件当前位置,SEEK_END或2,代表文件结尾处


  通过指定fromwork和offset的值,可使位置指针移动到文件的任意位置,从而实现文件的随机读取,如果函数fseek()调用成功,则返回0值,否则返回非0值


  两种特殊使用方式:


  将读写位置移动到文件开头:fseek(FILE *stream,0,SEEK_SET);
  将读写位置移动到文件尾:fseek(FILE *stream,0,0SEEK_END);


 (fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错)


 


  rewind()函数


  函数原型:void rewind(FILE *fp);


  函数功能:将文件位置指针指向文件首字节,即重置位置指针到文件首部


 


  ftell()函数


  函数原型:long ftell(FILE *fp);


  函数功能:读取当前文件指针的位置,若函数调用成功,则返回文件的当前读写位置,否则返回-1L,函数ftell()用于相对于文件起始位置的字节偏移量来表示返回的当前位置指针


  (需要注意的是,当用err = fopen_s(&fp, "E:\\ww.txt", "a+");打开文件后文件指针移到文件末尾,此时文件起始位置还是为文件头部并不是文件末尾)


 


   文件检测


  ferror()函数


  函数原型:int ferror(FILE *stream);


   函数功能:它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,


  均产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0


 


  feof()函数


  函数原型:int feof(FILE *fp);


  函数功能:检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()函数清除


  (函数feof()总是在读完文件所有内容后再执行一次读文件操作(将文件结束符读走,但不显示)才能返回真(非0)值


 


  C语言为了提高数据的输入/输出的速度,在缓冲型文件系统中,给打开的每一个文件建立一个缓冲区,文件内容先被批量地读入缓冲区,程序进行读操作时,实际上是从缓冲区中读取数据,


  写入操作也是如此,首先将数据写入缓冲区,然后在适当的时候(例如关闭时)再批量写入磁盘,这样虽然可以提高I/O的性能,但也有一些副作用,例如在缓冲区内容还未写入磁盘时,


  计算机突然死机或掉电,数据就会丢失,永远也找不回来,再如缓冲区被写入无用的数据时,如果不清除,其后的文件读操作都首先要读取这些无用的数据


  为了解决这个问题C语言提供了fflush()函数


 


  fflush()函数


  函数原型:int fflush(FILE *fp);


  函数功能:清除缓冲区的内容,对于输出流来说,fflush函数将已经写到缓冲区但尚未写入文件的所有数据写到文件中,对输入流来说,其结果是未定义的,


  如果在写的过程中发生错误,则返回EOF,否则返回0,(函数功能的另一种描述:无条件的将缓冲区的所有数据写入物理设备,这样程序员可自己决定何时清除缓冲区中的数据,以确保输出缓冲区的内容写入文件)


  ftell()函数


  函数原型:long ftell(FILE *fp);


  函数功能:读取当前文件指针位置,若函数调用成功,则返回文件的当前读写位置,否则返回-1L


  (函数ftell()用于相对于文件起始位置的字节偏移量来表示返回的当前位置指针)


 


  fflush(stdin);刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]


  fflush(stdout);刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上


  fflush(NULL);将清洗所有的输出流


 


  由于ANSIC规定函数fflush()处理输出数据流、确保输出缓冲区中的内容文件,但并未对清理输入缓冲区作出任何规定,只是部分编译器增加了此项功能,因此使用fflush(stdin)来清除缓冲区的内容,可能会带来移植性的问题


  (fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充))


  使用 fflush(stdin)是不正确的,至少是移植性不好的,因为那样的代码在一些环境下可能正常工作,但在另一些环境下则会出错,这导致程序不可移植,所以只能在写入文件的时候使用fflush


  


实际上,对于终端设备,系统会自动打开3个标准文件:标准输入、标准输出和标准错误输出,相应的,系统定义了3个特别的文件指针常数:stdin、stdout、stderr,


分别指向标准输入标准输出标准错误文件,这3个文件都以标准终端设备作为输入/输出对象,在默认情况下,标准输入设备时键盘,标注输出设备是屏幕


fprintf()是printf()的文件操作版,二者的差别在于fprintf()多了一个FILE *类型的参数fp,如果为其提供的第1个参数时stdout,那么它就和printf()完全一样,


同理可推广到fputc()和putchar()等其他函数,


例如:


putchar(c);和fputc(c,stdout);等价


getchar();和fgetc(stdin);等价


puts(str)和fputs(str,stdout);等价


但函数fgets()与gets()不同,从如下函数原型可知其区别在于fgets()还多了一个参数size


char *fgets(char *s,int size,FILE *stream);


char *gets(char *s);


fgets()用其第二个参数size来说明输入缓冲区的大小,使读

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言 队列(循环队列) 下一篇C语言 队列(链式队列)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目