SETBUF(3)

명칭
setbuf, setbuffer, setlinebuf, setvbuf - 스트림 버퍼링 조작

프로그램 라이브러리
libc

서식
<stdio.h> void setbuf(FILE *stream, char *buf) void setbuffer(FILE *stream, char *buf, int size) int setlinebuf(FILE *stream) int setvbuf(FILE *stream, char *buf, int mode, size_t size)

해설
이용할 수 있는 3 타입의 버퍼링은, 버퍼링 이루어, 블록 버퍼링, 및 행 버퍼링입니다. 출력 스트림이 버퍼링 없음의 경우, 정보는 기입해지면(자) 즉시 기입해 앞파일이나 단말에 표시됩니다. 출력 스트림이 블록 버퍼링의 경우, 다수의 캐릭터가 축적되고 블록으로서 기입해집니다. 출력 스트림이 행 버퍼링의 경우, 개행이 출력되는지, 또는 단말 디바이스에 아탓치 된 임의의 스트림 (통상은 stdin)(으)로부터 입력이 읽힐 때까지, 캐릭터를 저축할 수 있습니다. 함수 fflush(3) (을)를 사용해, 빨리 블록의 출력을 강제할 수도 있습니다 ( fclose(3) (을)를 참조).

통상, 모든 파일은 블록 버퍼링 됩니다. 파일에 대해서 최초의 입출력 조작이 발생했을 때, malloc(3) 하지만 불려 가 최적인 사이즈의 버퍼가 획득됩니다. ( stdout 하지만 통상 실시하도록(듯이)) 스트림이 단말을 참조하는 경우는 행 버퍼링입니다. 표준 에러 스트림 stderr (은)는 항상 버퍼링 없음입니다.

setvbuf() 함수는, 스트림의 버퍼링 동작을 변경하는데 사용할 수 있습니다. mode 파라미터는 다음의 3 개의 매크로의 어떤 것인가 나오지 않으면 안됩니다.

_IONBF
    버퍼링 없음

_IOLBF
    행 버퍼링

_IOFBF
    완전 버퍼링

size 파라미터는, 최적 사이즈의 버퍼를 언제나 대로에 지연 할당 시키기 위해서(때문에) 0 으로 설정할 수 있습니다. 이 파라미터가 0 이 아닌 경우, 버퍼링 없음의 파일을 제외하면, buf 인수는 적어도 길이가 size 바이트의 버퍼를 가리키지 않으면 안됩니다. 이 버퍼가 현재의 버퍼 대신에 사용됩니다 ( size 인수가 0 이 아니기는 하지만, buf 하지만 NULL 의 경우, 지정 사이즈의 버퍼가 즉시 할당해져 클로우즈시에 해방됩니다. 이것은 ANSI C 의 확장입니다. 이식 가능 코드는 사이즈가 0 의 NULL 버퍼를 사용할 것입니다).

setvbuf() 함수는 언제라도 사용할 수 있습니다만, 스트림이 ``액티브''경우에, (예를 들어, 입력의 잘라서 버림이나 출력의 플래시등의) 기묘한 부작용을 가지는 일이 있습니다. 이식 가능한 어플리케이션은, 하등의 입출력 하지만 실행되기 전에, 지정된 임의의 스트림에 대해서 이 함수를 한 번만 호출해야 합니다.

다른 3 개의 호출은, 실제로는, setvbuf() 호출의 별명에 지나지 않습니다. 반환값이 없는 것을 제외해, setbuf() 함수는 이하의 호출과 엄밀하게 같습니다.

    setvbuf(stream, buf, buf ?  _IOFBF : _IONBF, BUFSIZ);

setbuffer() 함수는, 버퍼의 사이즈를 호출해 원이 결정해 디폴트의 BUFSIZ 그리고 결정되는 것은 아닌 것 이외는 같습니다. setlinebuf() 함수는, 다음의 호출과 엄밀하게 같습니다.

    setvbuf(stream, (char *) NULL, _IOLBF, 0);

반환값
setvbuf() 함수는 정상 종료하면(자) 0 을 돌려줍니다. 요구가 받아들여지지 않는 경우는 EOF (을)를 돌려줍니다 (스트림은 이 경우에서도 여전히 기능하고 있는 것에 주의해 주세요).

setlinebuf() 함수는, 동등의 setvbuf() 호출이 돌려주었음이 분명한 값을 돌려줍니다.

관련 항목
fclose(3), fopen(3), fread(3), malloc(3), printf(3), puts(3)

표준
setbuf() 함수와 setvbuf() 함수는 isoC 에 적합하고 있습니다.

버그
setbuffer() 함수와 setlinebuf() 함수는, 4.2BSD 보다 전의 버젼의 BSD 에 이식 가능하지는 않습니다. 4.2BSD 시스템과 4.3BSD 시스템에서는, setbuf() (은)는, 최적이지 않는 버퍼 사이즈를 항상 사용하므로, 피해 주세요.