繁体   English   中英

文件I / O中的缓冲区大小

[英]Buffer size in file I/O

我正在尝试编写一个小程序来查找打开文件流的缓冲区大小。 在搜索了一下之后,我找到了__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一起使用,则会得到一个非零值。

请注意, 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

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

<stdio.h>定义的宏BUFSIZ是默认缓冲区大小。 找不到setvbuf()设置的缓冲区大小没有标准方法。 您需要确定正在处理的平台,以便在__fbufsize()作为函数进行有用的注释(尽管它似乎是一个GNU libc扩展: __fbufsize() )。

应该在程序中进行许多小的改进,但它们并没有立即密切相关。

__fbufsize手册页说:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM