【问题标题】:Buffer size in file I/O文件 I/O 中的缓冲区大小
【发布时间】:2015-02-04 00:07:37
【问题描述】:

我正在尝试编写一个小程序来查找打开文件流的缓冲区大小。经过一番搜索,我找到了 __fbufsize() 函数。这是我写的代码:

#include <stdio.h>
#include <stdio_ext.h>

void main() {
   FILE *f;
   int bufsize;

   f = fopen("test.txt","wb");
   if (f == NULL) {
      perror("fopen failed\n");
      return;
   }

   bufsize = __fbufsize(f);

   printf("The buffer size is %d\n",bufsize);

   return;
}

我将缓冲区大小设为零。我有点困惑为什么会这样。默认情况下不应该缓冲流吗?如果我在调用 fbufsize 之前将 setvbuf 与 _IOFBF 一起使用,我会得到一个非零值。

【问题讨论】:

  • &lt;stdio.h&gt; 中定义的宏 BUFSIZ 是默认缓冲区大小。没有标准方法可以找到setbuf()setvbuf() 设置的缓冲区大小。您需要确定您正在开发的平台,以允许对 __fbufsize() 作为函数进行有用的评论(尽管它似乎是 GNU libc 扩展:__fbufsize()
  • 在您使用文件流之前,很有可能不会设置缓冲区大小。在那之前,您可以使用setvbuf() 更改大小,因此库可能在您尝试使用它之前不会设置缓冲区大小。在printf()后面加上fputc('a', f);,然后再次测试大小;它可能不再是零了。

标签: c


【解决方案1】:

请注意,main() 的正确返回类型是 int,而不是 void

此代码在 Linux 上编译(Ubuntu 14.04 衍生测试):

#include <stdio.h>
#include <stdio_ext.h>

int main(void)
{
    FILE *f;
    size_t bufsize;

    f = fopen("test.txt", "wb");
    if (f == NULL)
    {
        perror("fopen failed\n");
        return -1;
    }

    bufsize = __fbufsize(f);
    printf("The buffer size is %zd\n", bufsize);

    putc('\n', f);
    bufsize = __fbufsize(f);
    printf("The buffer size is %zd\n", bufsize);

    fclose(f);
    return 0;
}

运行时会产生:

The buffer size is 0
The buffer size is 4096

正如 cmets 中所建议的,在您使用文件流之前,不会设置缓冲区大小。在那之前,您可以使用setvbuf() 更改大小,因此库在您尝试使用它之前不会设置缓冲区大小。

&lt;stdio.h&gt; 中定义的宏 BUFSIZ 是默认缓冲区大小。没有标准方法可以找到setvbuf() 设置的缓冲区大小。您需要确定您正在开发的平台,以允许对 __fbufsize() 作为函数进行有用的评论(尽管它似乎是 GNU libc 扩展:__fbufsize())。

该程序有许多小的改进,但它们并不是直接相关的。

【讨论】:

  • 有趣。我也在使用 Linux 机器(OpenSUSE)。作为一个附带问题,BUFSIZ 架构的价值是特定的吗?我得到的值为 32768。
  • @npn:肯定会因操作系统而异。在 Mac OS X(10.9.5 Mavericks)上,BUFSIZE(64 位编译)得到 1024。经典的是 512;这些天,1024或4096是正常的; 32768 比我以前见过的要大,但也不算大。
【解决方案2】:

__fbufsize 手册页说:

__fbufsize() 函数返回给定流当前使用的缓冲区大小。

所以我认为这是流使用的缓冲区大小。

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多