setvbuf
|
헤더 파일에 정의됨
<stdio.h>
|
||
| (C99 이전) | ||
| (C99부터) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
주어진 파일 스트림
stream
의 버퍼링 모드를 인자
mode
로 표시된 대로 변경합니다. 또한,
-
만약
buffer가 null 포인터라면, 내부 버퍼의 크기를size로 조정합니다. -
만약
buffer가 null 포인터가 아니라면, 스트림이buffer에서 시작하는 사용자 제공 크기size의 버퍼를 사용하도록 지시합니다. 스트림은buffer가 가리키는 배열의 수명 이 끝나기 전에 ( fclose 로) 닫혀야 합니다.setvbuf호출이 성공한 후 배열의 내용은 정의되지 않으며, 이를 사용하려는 모든 시도는 미정의 동작입니다.
목차 |
매개변수
| stream | - | 버퍼를 설정할 파일 스트림 | ||||||
| buffer | - | 스트림이 사용할 버퍼에 대한 포인터 또는 크기와 모드만 변경하기 위한 null 포인터 | ||||||
| mode | - |
사용할 버퍼링 모드. 다음 값 중 하나일 수 있습니다:
|
||||||
| size | - | 버퍼 크기 |
반환값
0 성공 시 0 또는 실패 시 0이 아닌 값.
참고 사항
이 함수는
stream
이 열린 파일과 연결된 후에만 사용할 수 있지만, 다른 작업(실패한
setbuf
/
setvbuf
호출 제외) 이전에 사용해야 합니다.
모든
size
바이트가 반드시 버퍼링에 사용되는 것은 아닙니다: 실제 버퍼 크기는 일반적으로 2의 배수, 페이지 크기의 배수 등으로 내림 처리됩니다.
많은 구현에서, 라인 버퍼링은 터미널 입력 스트림에 대해서만 사용 가능합니다.
흔한 오류 중 하나는 stdin이나 stdout의 버퍼를 프로그램이 종료되기 전에 수명이 끝나는 배열로 설정하는 것입니다:
기본 버퍼 크기 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 함수
참고 항목
|
파일 스트림의 버퍼를 설정합니다
(함수) |
|
|
C++ documentation
for
setvbuf
|
|