리그캣의 개발놀이터

C - setbuf 함수[setbuf()] 본문

프로그래밍 언어/C

C - setbuf 함수[setbuf()]

리그캣 2018. 1. 19. 20:21

setbuf 함수에 대해서 알아보도록 하자.


선언 <strdio.h>


반환 값 


없음


입력 값


FILE* _File : 리다이렉션할 파일 포인터

char* _Buffer : 리다이렉션할 버퍼


설명


파일 포인터를 지정된 버퍼의 크기만큼 리다이렉션해주는 함수이다.

쉽게 말하자면 파일 포인터를 지정된 버퍼의 크기만큼 사용하겠다고 설정해 주는 것.

버퍼자체를 사용하는 게 아니므로 버퍼에는 아무런 변화가 없다.

지정된 버퍼를 NULL로 설정하면 함수 내부에서 필요한만큼 크기를 할당해서 사용한다.

표준 스트림을 통하는 파일 포인터 stdin, stdout, stderr도 사용이 가능하다.

예를 들어 stdout을 char형 10 크기의 버퍼로 리다이렌션하면 stdout의 크기가 10이 된다.

원래 stdout의 크기는 0입니다. 처음에는 0이었지만 출력할 내용이 생기면 그만큼 할당하고 다시 비워줍니다.

stderr도 stdout처럼 크기가 0입니다. 하지만 stdin은 4096의 크기를 가지고 있습니다.

stdin의 크기가 4096이다 보니 입력할때 개행 문자 문제가 발생합니다.


scanf()로 입력한 뒤 엔터를 치면 개행 문자('\n')가 입력 버퍼에 남는 현상이 발생합니다.

왜냐하면 scanf()는 공백을 인식하지 않기 때문입니다.

이때 또 scanf("%c")나 scanf("%s")를 사용하게 되면 입력 버퍼에 있는 공백 문자도 인식하게 됩니다.

그렇게 되면 입력 버퍼에 있는 공백 문자가 입력되는 상황이 발생하므로 원하는 결과를 얻을 수 없습니다.

이런 상황을 해결하려면 입력 버퍼를 비워줘야 하는데 보통은 fflush(stdin)을 사용합니다.


하지만 fflush(stdin)은 표준 사용법이 아닙니다. fflush()는 출력 버퍼를 비워주는 함수입니다.

원래 입력 버퍼를 비워줄 때는 setbuf(), setvbuf()의 사용을 권장하고 있습니다.

fflush(stdin)은 표준이 아니다 보니 Linux에서는 작동도 안되고

비주얼 스튜디오 2015에서는 scanf()의 변화로 fflush(stdin)이 작동되지 않습니다.


#include <stdio.h>
#include <stdlib.h>
int main()
{
//BUFSIZ는 최소 버퍼 크기 => 512
char RedirectionBuffer[BUFSIZ];
char cASCII;
char szBuffer[BUFSIZ];
FILE* pStdout = stdout;
FILE* pStdin = stdin;
FILE* pStderr = stderr;
printf("출력 버퍼의 크기 : %d바이트\n", pStdout->_sizeof);
printf("입력 버퍼의 크기 : %d바이트\n", pStdin->_sizeof);
printf("오류 출력 버퍼의 크기 : %d바이트\n\n", pStderr->_sizeof);
//표준 입출력 버퍼 리다이렉션
setbuf(stdout, NULL);
setbuf(stderr, RedirectionBuffer);
setbuf(stdin, RedirectionBuffer);
printf("출력 버퍼의 크기 : %d바이트\n", pStdout->_sizeof);
printf("입력 버퍼의 크기 : %d바이트\n", pStdin->_sizeof);
printf("오류 출력 버퍼의 크기 : %d바이트\n\n", pStderr->_sizeof);
scanf("%c", &cASCII);
printf("입력된 문자 : %c\n\n", cASCII);
setbuf(stdin, RedirectionBuffer);
scanf("%c", &cASCII);
printf("입력된 문자 : %c\n\n", cASCII);
setbuf(stdin, RedirectionBuffer);
scanf("%c", &cASCII);
printf("입력된 문자 : %c\n\n", cASCII);
scanf("%s", szBuffer);
printf("입력된 문자열 : %s\n", szBuffer);
return 0;
}


참고 - RuveniX 블로그

'프로그래밍 언어 > C' 카테고리의 다른 글

scanf_s 함수  (0) 2018.01.24
strcmp() 문자열 비교 함수  (0) 2018.01.24
[c언어]미로 빠져나오기  (0) 2018.01.21
외부 파일 가전와 숫자만 출력(C언어)  (0) 2018.01.21
Comments