2015-02-04 2 views
3

Я пытаюсь написать небольшую программу, чтобы найти размер буфера открытого потока файлов. После небольшого поиска я обнаружил функцию __fbufsize(). Это код, который я написал:Размер буфера в файле I/O

#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; 
} 

Я получаю размер буфера как ноль. Я немного смущен, почему это происходит. Не следует ли буферизовать поток по умолчанию? Я получаю ненулевое значение, если я использую setvbuf с _IOFBF перед вызовом fbufsize.

+2

Макрос 'BUFSIZ', определенный в' '- размер буфера по умолчанию. Нет стандартного способа найти размер буфера, заданный 'setbuf()' или 'setvbuf()'. Вам нужно определить платформу, над которой вы работаете, чтобы дать полезный комментарий к '__fbufsize()' как функцию (хотя, похоже, это расширение GNU libc: ['__fbufsize()'] (http: //linux.die .net/man/3/__ fbufsize) –

+1

Существует также неплохой шанс, что до тех пор, пока вы не будете использовать поток файлов, размер буфера не будет установлен. До тех пор вы можете изменить размер с помощью 'setvbuf()', поэтому библиотека, вероятно, не задает размер буфера, пока вы не попытаетесь его использовать. Добавьте 'fputc ('a', f);' после 'printf()', а затем снова проверьте размер, он, вероятно, уже не равен нулю. –

ответ

5

Обратите внимание, что правильный тип возврата для 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(), поэтому библиотека не устанавливает размер буфера, пока вы не попытаетесь его использовать.

Макрос BUFSIZ, определенный в <stdio.h>, представляет собой размер буфера по умолчанию. Нет стандартного способа найти размер буфера, заданный setvbuf(). Вам нужно определить платформу, над которой вы работаете, чтобы дать полезный комментарий в __fbufsize() как функцию (хотя, похоже, это расширение GNU libc: __fbufsize()).

Существует множество небольших улучшений, которые должны быть сделаны в программе, но они не всегда актуальны.

+0

Интересно, я тоже использую Linux-машину (OpenSUSE). В качестве побочного вопроса, является ли значение архитектуры BUFSIZ конкретным? Я получаю значение как 32768. – npn

+0

@npn: Это зависит от O/S. Mac OS X (10.9.5 Mavericks), я получаю 1024 для BUFSIZE (64-битная компиляция). Классически это было 512, в наши дни 1024 или 4096 - нормальные, 32768 больше, чем я видел раньше, но не возмутительно. –

0

__fbufsize человек страница говорит:

__fbufsize() функция возвращает размер буфера в настоящее время используется в данном потоке.

поэтому, я думаю, что это размер буфера, используемый потоком.

Смежные вопросы