Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
헤더 파일에 정의됨 <cstdio>
int setvbuf ( std:: FILE * stream, char * buffer, int mode, std:: size_t size ) ;

주어진 파일 스트림 stream 의 버퍼링 모드를 인자 mode 가 지정하는 대로 변경합니다. 또한,

  • buffer 가 null 포인터인 경우, 내부 버퍼의 크기를 size 로 조정합니다.
  • buffer 가 null 포인터가 아닌 경우, 스트림이 buffer 에서 시작하는 크기 size 의 사용자 제공 버퍼를 사용하도록 지시합니다. 스트림은 buffer 가 가리키는 배열의 수명 이 종료되기 전에 ( std::fclose 로) 닫혀야 합니다. std::setvbuf 호출이 성공한 후 배열의 내용은 불확정적이며, 이를 사용하려는 모든 시도는 정의되지 않은 동작입니다.

목차

매개변수

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

반환값

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

참고 사항

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

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

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

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

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

기본 버퍼 크기 BUFSIZ 는 구현 환경에서 파일 I/O에 가장 효율적인 버퍼 크기로 예상되지만, POSIX fstat 이 종종 더 나은 예측값을 제공합니다.

예제

버퍼 크기를 변경하는 한 가지 사용 사례는 더 나은 크기를 알고 있을 때입니다.

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <sys/stat.h>
int main()
{
    std::FILE* fp = std::fopen("/tmp/test.txt", "w+");
    if (!fp)
    {
        std::perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        std::perror("fstat");
        return EXIT_FAILURE;
    }
    std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is "
              << stats.st_blksize << '\n';
    if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0)
    {
        std::perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    // Read entire file: use truss/strace to observe the read(2) syscalls used
    for (int ch; (ch = std::fgetc(fp)) != EOF;)
    {}
    std::fclose(fp);
    return EXIT_SUCCESS;
}

가능한 출력:

BUFSIZ is 8192, but optimal block size is 65536

참고 항목

파일 스트림의 버퍼를 설정함
(함수)
[virtual]
사용자 제공 버퍼를 제공하거나 이 filebuf를 버퍼링 없음으로 전환함
( std::basic_filebuf<CharT,Traits> 의 virtual protected 멤버 함수)
C 문서 for setvbuf