완료됨
setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); 의 의미?

안녕하세요.
해당 문제를 푸는 중 나온 함수인 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

로 정의가 되는데 잘 모르겠는게 많습니다.

  1. 첫번 째 인자를 stdin으로 두었을 때와 stdout으로 두었을 때의 차이점
  2. 두번째 인자는 '배열공간의 주소'를 의미하는데 이 값이 0인게 무엇을 의미하는 건지
  3. 버퍼모드의 값이 2인데 이게 _IONBF를 말하는 건지... 공식 문서를 봐도 숫자를 입력해도 된다는 말이 없는데 왜 2라는 값이 들어가 있는 건지, 2가 뭘 의미하는 건지, 2가 되는 거면 0도 되고 4도 된다는 말인건지 햇갈립니다.
  4. 마지막 인자가 버퍼의 사이즈로 코드 상 0으로 나타나고 있는데 그럼 입력과 출력을 차단하겠다는 뜻인건지 아니면 버퍼 없이 바로 입력과 출력이 적용된다는 건지 잘 모르겠습니다.

해당 함수가 전문적으로 들어가지 않으면 일반적으로 잘 사용되는 함수가 아니라 검색을 해도 잘 안 나오는 것 같아 이렇게 글 쓰게 되었습니다.

#c #setvbuf
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
Thengel
대표 업적 없음

일단 문제를 풀때 setbuf는 신경쓰지 않아도 됩니다

단순하게 setbuf는 버퍼링을 설정하는 함수로 알고있지만
정확하게 확인하기 위해 chatgpt로 확인했을때

setbuf(스트림 지정(stdin,stdout,stderr), 버퍼지정 포인터, 버퍼모드, 버퍼크기)

주어진 코드에
setvbuf(stdin, 0, 2, 0);는
stdin(표준 입력 ex) scanf), 0 (버퍼사용x), 2(무버퍼링모드), 0(무버퍼링이므로 0으로 설정)

즉 표준 출력과 표준 입력의 버퍼링을 사용하지 않는다는 의미입니다.

  1. stdin은 표준입력, stdout은 표준출력으로 입출력을 사용할때 버퍼링을 설정
  2. 0인것은 버퍼링을 사용하지 않는다는 의미
  3. 2는 무버퍼링이라는 의미
  4. 버퍼링을 사용하지 않으니 크기도 0으로 설정

chatgpt를 사용한다면 쉽게 알아낼 수 있습니다 ㅎㅎ

2024.09.07. 16:29