返回介绍

9.4.2 设置文件缓冲区

发布于 2025-04-11 22:33:05 字数 1889 浏览 0 评论 0 收藏 0

前面介绍过,文件的读写过程会用到缓冲区,当读取文件时,会将文件中的数据先放入缓冲区,程序再从缓冲区中读取数据;当写入文件时,也会将数据先放入缓冲区,当缓冲区满或者被刷新时,才会将缓冲区中的数据一次性写入文件。使用缓冲区的好处是,减少对外部存储介质的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。