std:: setvbuf
|
헤더 파일에 정의됨
<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 | - |
사용할 버퍼링 모드. 다음 값 중 하나일 수 있음:
|
||||||
| 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
|
|