fread和fwrite是标准IO,在调用文件IO的基础上封装了用户空间缓冲区。这样可以减少系统调用的次数,在频繁使用IO的场景中减少系统开销。
因此,调用fwrite向文件中写入数据时,数据不会立即被写入到文件中,而是先被写入到内存中的缓冲区,当缓冲区满或者调用fclose()或者调用fflush()后才会将内存缓冲区中的数据写入到目标文件中。其实,在调用fflush()后,再次调用fsync()方能保证fwite写入的数据写入到磁盘中。
调用fread()会一次性从文件中读出相当多的数据到用户空间缓冲区中,然后慢慢从用户空间缓冲区取走数据,当缓冲区空,再次调用read()函数读取文件内容到缓冲区。当在fread()后调用fflush()时,会清除用户空间缓冲区中未被应用程序读取过的数据。
当使用标准IO并且需要立即将写入到用户空间缓冲区的数据刷新到文件中时,在fwrite()后调用fflush()。一般不需要在fread()后调用fflush()。