Namespaces
Variants

setvbuf

From cppreference.net
< c ‎ | io
헤더 파일에 정의됨 <stdio.h>
int setvbuf ( FILE * stream, char * buffer,
int mode, size_t size ) ;
(C99 이전)
int setvbuf ( FILE * restrict stream, char * restrict buffer,
int mode, size_t size ) ;
(C99부터)
#define _IOFBF     /*unspecified*/

#define _IOLBF     /*unspecified*/

#define _IONBF     /*unspecified*/

주어진 파일 스트림 stream 의 버퍼링 모드를 인자 mode 로 표시된 대로 변경합니다. 또한,

  • 만약 buffer 가 null 포인터라면, 내부 버퍼의 크기를 size 로 조정합니다.
  • 만약 buffer 가 null 포인터가 아니라면, 스트림이 buffer 에서 시작하는 사용자 제공 크기 size 의 버퍼를 사용하도록 지시합니다. 스트림은 buffer 가 가리키는 배열의 수명 이 끝나기 전에 ( fclose 로) 닫혀야 합니다. setvbuf 호출이 성공한 후 배열의 내용은 정의되지 않으며, 이를 사용하려는 모든 시도는 미정의 동작입니다.

목차

매개변수

stream - 버퍼를 설정할 파일 스트림
buffer - 스트림이 사용할 버퍼에 대한 포인터 또는 크기와 모드만 변경하기 위한 null 포인터
mode - 사용할 버퍼링 모드. 다음 값 중 하나일 수 있습니다:
_IOFBF 전체 버퍼링
_IOLBF 라인 버퍼링
_IONBF 버퍼링 없음
size - 버퍼 크기

반환값

0 성공 시 0 또는 실패 시 0이 아닌 값.

참고 사항

이 함수는 stream 이 열린 파일과 연결된 후에만 사용할 수 있지만, 다른 작업(실패한 setbuf / setvbuf 호출 제외) 이전에 사용해야 합니다.

모든 size 바이트가 반드시 버퍼링에 사용되는 것은 아닙니다: 실제 버퍼 크기는 일반적으로 2의 배수, 페이지 크기의 배수 등으로 내림 처리됩니다.

많은 구현에서, 라인 버퍼링은 터미널 입력 스트림에 대해서만 사용 가능합니다.

흔한 오류 중 하나는 stdin이나 stdout의 버퍼를 프로그램이 종료되기 전에 수명이 끝나는 배열로 설정하는 것입니다:

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // buf의 수명이 종료되며, 정의되지 않은 동작

기본 버퍼 크기 BUFSIZ 는 구현체에서 파일 입출력에 가장 효율적인 버퍼 크기로 예상되지만, POSIX fstat 이 종종 더 나은 추정치를 제공합니다.

예제

버퍼 크기를 변경하는 한 가지 사용 사례는 더 나은 크기를 알고 있을 때입니다. (이 예제는 fileno 같은 일부 POSIX 함수를 사용합니다. 참고: SO: #1 #2 ).

// Make some POSIX functions, such as `int fileno(FILE*)`, visible:
#define _POSIX_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void)
{
    FILE* fp = fopen("/tmp/test.txt", "w+");
    if (fp == NULL)
    {
        perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        perror("fstat");
        return EXIT_FAILURE;
    }
    printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize);
    if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0)
    {
        perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    int ch;
    while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
                                  // observe the read(2) syscalls used
    fclose(fp);
    return EXIT_SUCCESS;
}

가능한 출력:

BUFSIZ is 8192, but optimal block size is 65536

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21.5.6 setvbuf 함수 (p: 225)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21.5.6 setvbuf 함수 (p: 308)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19.5.6 setvbuf 함수 (p: 273-274)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9.5.6 setvbuf 함수

참고 항목

파일 스트림의 버퍼를 설정합니다
(함수)