C语言文件操作(FILE)与常用文件操作函数(4)

  (函数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

  

4、标准输入/输出重定向

实际上,对于终端设备,系统会自动打开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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2078301fb42c8c2b0f1fd154645abc7d.html