안녕하세요.
해당 문제를 푸는 중 나온 함수인 setvbuf가 잘 이해가 안가서 질문 올립니다.
setvbuf는 init 함수에 아래와 같이 정의 되어 있었는데요
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
setvbuf의 정의를 보면
int setvbuf(FILE *fp, char *buf, int mode, size_t size);
로 되어있습니다.
이때
fp
버퍼를 설정할 파일 포인터
buf
버퍼로 사용할 배열 공간 주소
mode
버퍼 모드
_IOFBF, _IOLBF, _IONBF 사용 가능
size
버퍼의 크기, 기본은 BUFSIZ
로 정의가 되는데 잘 모르겠는게 많습니다.
- 첫번 째 인자를 stdin으로 두었을 때와 stdout으로 두었을 때의 차이점
- 두번째 인자는 '배열공간의 주소'를 의미하는데 이 값이 0인게 무엇을 의미하는 건지
- 버퍼모드의 값이 2인데 이게 _IONBF를 말하는 건지... 공식 문서를 봐도 숫자를 입력해도 된다는 말이 없는데 왜 2라는 값이 들어가 있는 건지, 2가 뭘 의미하는 건지, 2가 되는 거면 0도 되고 4도 된다는 말인건지 햇갈립니다.
- 마지막 인자가 버퍼의 사이즈로 코드 상 0으로 나타나고 있는데 그럼 입력과 출력을 차단하겠다는 뜻인건지 아니면 버퍼 없이 바로 입력과 출력이 적용된다는 건지 잘 모르겠습니다.
해당 함수가 전문적으로 들어가지 않으면 일반적으로 잘 사용되는 함수가 아니라 검색을 해도 잘 안 나오는 것 같아 이렇게 글 쓰게 되었습니다.
일단 문제를 풀때 setbuf는 신경쓰지 않아도 됩니다
단순하게 setbuf는 버퍼링을 설정하는 함수로 알고있지만
정확하게 확인하기 위해 chatgpt로 확인했을때
setbuf(스트림 지정(stdin,stdout,stderr), 버퍼지정 포인터, 버퍼모드, 버퍼크기)
주어진 코드에
setvbuf(stdin, 0, 2, 0);는
stdin(표준 입력 ex) scanf), 0 (버퍼사용x), 2(무버퍼링모드), 0(무버퍼링이므로 0으로 설정)
즉 표준 출력과 표준 입력의 버퍼링을 사용하지 않는다는 의미입니다.
- stdin은 표준입력, stdout은 표준출력으로 입출력을 사용할때 버퍼링을 설정
- 0인것은 버퍼링을 사용하지 않는다는 의미
- 2는 무버퍼링이라는 의미
- 버퍼링을 사용하지 않으니 크기도 0으로 설정
chatgpt를 사용한다면 쉽게 알아낼 수 있습니다 ㅎㅎ