9.4.2 设置文件缓冲区
前面介绍过,文件的读写过程会用到缓冲区,当读取文件时,会将文件中的数据先放入缓冲区,程序再从缓冲区中读取数据;当写入文件时,也会将数据先放入缓冲区,当缓冲区满或者被刷新时,才会将缓冲区中的数据一次性写入文件。使用缓冲区的好处是,减少对外部存储介质的 I/O 次数,提高程序的运行效率。
大多情况下,对文件进行读写,使用的都是由系统提供的缓冲区。不过,用户也可以自己设置文件缓冲区,并替换掉系统所提供的默认缓冲区。这就需要用到 C 标准库函数 setvbuf,该函数的原型如下:
int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
setvbuf 函数有四个参数,其中 stream 为与文件相关联的文件流;buffer 为缓冲区的首地址;mode 为缓冲区的模式,它有 3 种取值,如表 9.3 所示;size 为缓冲区的大小。函数的功能为,将大小为 size、模式为 mode 的缓冲区 buffer,设置为文件流 stream 的新缓冲区,若参数 mode 被设置为_IONBF,则表示文件流 stream 不使用缓冲区。函数执行成功返回 0,失败返回非零值。
表 9.3 mode 参数的 3 种取值
下面用一段代码演示 setvbuf 函数的使用。
代码中,首先定义了长度为 10 的字符数组 buf。然后在 if 语句中,setvbuf 函数会用 buf 数组替换默认的缓冲区,缓冲模式为全缓冲,即缓冲区满时才会刷新。接着,通过 fpirntf 函数使用格式化方式向文件写入一个由 13 个字符组成的字符串。
编译运行该程序后,打开 D 盘的 test.txt 文件,会发现文件中并非完整的 13 个字符,如图 9.5 所示。
图 9.5 D 盘 test.txt 文件内容
在向文件写入字符串时,首先会将字符写入缓冲区中,由于采用的是全缓冲模式,并且缓冲区的大小为 10,因此,当前 10 个字符进入缓冲区后,缓冲区满会自动刷新,把这 10 个字符写入到文件中,而剩余的 3 个字符没有写入到文件。
解决的办法很简单,就是在写入完毕后,调用 fflush 函数强制刷新缓冲区,或者调用 fclose 函数关闭文件,它也会隐式地调用 fflush 对缓冲区进行刷新。例如:
这次再重新编译运行程序,打开 D 盘 test.txt 文件后,会发现所有的字符全部写入文件中,如图 9.6 所示。
图 9.6 D 盘 test.txt 文件内容
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论