簡體   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