• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

궁금한게 있습니다.

21.08.20 15:34 작성 조회수 141

0

위 예시에서 fscanf 의 stream 이 stdin 이면

getchar() 를 통해 int a 에 정상적으로 '\n'이 저장되는데요

stdin 이 아닌 위의 "hoho.txt" 파일을 읽을때에는 int a 에 '\n'이 저장이 되지않습니다.

scanf에 %*c 를 붙이지도 않았는데 말이죠

왜그런건지 알수 있을까요?

아 그리고 강의 내용 read_book 에서

fscanf의 "%[^\n]%*c"

이걸 "%[^\n]" 로 쓰고

뒤에 while(getchar() != '\n');

이 두 문구는 같은 내용 아닌가요??

왜 첫번째 코드는 잘 작동하는 반면에

두번째 코드는 에러가 뜨는건지 모르겠습니다.

이거도 보니까 첫번째 질문과 관련이 있어보이네요

답변 1

답변을 작성해보세요.

1

안소님의 프로필

안소

2021.08.21

안녕하세요

파일 스트림과 stdin 스트림은 서로 입력 버퍼 자체가 다르기 때문입니다. (getchar 는 stdin 스트림으로부터 입력 받아오는 함수입니다.) 

fscanf 에 fp 를 넘겨주셨으면 이건 hoho.txt 에서 읽어오는 파일 스트림을 쓰겠다는거구요, stdin 을 넘겨주셨으면 이건 표준 입력 스트림을 쓰겠다는 것입니다.

fp 스트림에 1 \n abcd \n 가 담겨있는 것이지, stdin 스트림에는 아무것도 담겨있지 않은 상태인 것입니다. 그래서 fp 로 입력 받으셨을 땐 getchar() 에서 받아올 것이 없으니 콘솔창이 활성화 되었던 것입니다.

반면 fscanf가 stdin 스트림으로 입력을 받았다면 fscanf 와 getchar() 가 1 \n abcd \n 이 들어있는 이 스트림을 공유하게 됩니다. 같은 스트림이니까ㄹ요. 그래서 getchar() 에서 \n 을 잘 받아온거구요.

아랫 부분은 제가 강의에서 잘 못찾겠는데 (read_book2 말씀하시는 것 같은데 맞나 해서요..!) 어떤 부분인지 시간대와 함께 알려주실 수 있을까요?

(제가 read_book 이 어디나오는지 강의에서 찾아봐야해서ㅠㅠ 강의 관련해서 질문주실 땐 구체적인 시간대 함께 남겨주시면 감사할것 같아요!)

근데 아무쪼록 밑에 있는 질문도 위와 같은 이유일 것 같네요. 파일 입력 스트림과 콘솔 입력 스트림은 버퍼가 서로 별개라는 것.