在使用fwrite, fread时,并不是每调用一次就对文件进行读写操作。标准I/O为write,read之类的调用提供了缓存。它对每个I/O流自动的进行缓存管理,避免应用程序需要考虑这点所带来的麻烦。这样做的目的是避免频繁I/O操作浪费大量时间。然而,我们在实际编程中往往欠考虑I/O 缓存机制,从而带来许多意想不到的麻烦。
缓存有三种类型,分别是全缓存,行缓存,不带缓存(见一本伟大的书《Unix 环境高级编程》)。一般我们操作磁盘上文件的时候,用全缓存的类型。即调用读写函数填满缓存后,才真正对文件进行一次读写操作。
我们可以通过setbuf或者setvbuf来改变缓存类型,。在libc中,默认的缓存大小为8k字节,见stdio.h (#define _G_BUFSIZ 8192) 。我们可以根据我们需要来改变这个缓存大小。
任何时候,我们都可根据需要通过调用fflush()强制刷新一个流,这样可使得缓存没填满的情况下,对文件进行实际的操作。通常这种情况出现在数据流的末尾。如果你经常出现数据在文件末尾丢失的情况,那么就要考虑是否要用fflush来将缓存的内容写入文件。
当然,fclose()的作用fflush。即调用fclose后,缓存无论有没有填满,都要将缓存内容写入文件。所以,fclose()作用还是很明显的,千万不要偷懒,在每次操作后都要关文件流。