file 입출력을 다루기 위해서는, 입출력 함수들에 대해서 알고 있어야 합니다. 오늘은 이 중에서 getchar에 대해서 알아보도록 하겠습니다. 이 함수는 getc(stdin)을 호출한 것과 동일한 역할을 한다고 링크에서 설명을 하고 있어요. getc와 fgetc에 대해서는, 추후에 다시 설명을 할 기회가 있을 듯 싶네요.

 

 


stdin에서 어떻게 읽어오는지 대략적으로 그림을 그리실 필요가 있어요.

 

 

 예를 들어, 이런 프로그램이 있다고 생각해 봅시다. 저는 age와 성별을 받았습니다. 그렇게 해서, 나이와 성별에 대한 정보를 출력하기를 기대하고 있어요. 

 

 

 그런데, 실제로는, age에는 23이 들어갔는데 gen에는 M이나 F가 저장되지 않았다는 것을 알 수 있어요.

 

 

 예를 들어 2를 입력하고 엔터를 쳤다고 해 봅시다. 그러면, 다음과 같이 들어가 있을 겁니다. 여기서, 6번째 줄의 scanf에 의해서, 2가 읽혀집니다.

 

 

 그러면 남는 문자는 '\n'입니다.

 

 

 '\n'도 문자에 속합니다. 심지어, 이 링크에는 다음과 같이 나와 있어요.

 

 

 화이트 스페이스라는 제약이 없으니 '\n'을 그냥 받아버릴 거에요. 결론적으로 제가 입력하려고 했던 'F'나 'M'은 입력받지도 못하고, '\n'이라는, 버퍼에 남아있는 값을 입력받게 된 것입니다. 그러면, 이렇게 버퍼에 남아 있는 값을 Character 단위로 읽어야 할 때, 어떤 것을 쓰면 좋을까요?

 

 getchar를 쓰시면 됩니다. 여기서 질문. 한글 '개'를 입력했을 때, getchar로 딱 1번만 읽으면, '개'를 읽어올 수 있을까요?

 

 


 이제, 코드를 아래와 같이 바꿔 봅시다.

 

 그러면 어떻게 될까요? age를 입력 받았고, 그 다음에 엔터를 입력한 상황입니다. 그러면, 6번째 줄의 scanf를 끝낸 시점에서 버퍼에는 개행 문자가 하나 남아 있을 겁니다.

 

 

 getchar를 호출하면 이 개행 문자를 읽어낼 겁니다. 그러면 stdin에 아무것도 남지 않을 겁니다. 이 때, M이라는 것을 입력하고 엔터를 치면, stdin에 다음과 같은 내용이 저장될 겁니다.

 

 

 다음에, scanf로 Character 하나를 입력 받아 온다면 'M'을 받아올 겁니다.

 

 

 의도했던 대로 동작하는군요.

 

 


 그런데, EOF를 리턴하는 경우도 있어요. 이 때에는 둘 중 하나입니다. 읽기를 실패하거나, 파일의 끝에 도달하거나. 이게 무슨 말인지 모르겠네요. "23"을 입력하고 getchar를 5번 호출해 봅시다.

 

 

 프로그램으로 작성하면 위와 같겠네요.

 

 

 그러면, 50, 51이 리턴이 되고, -1, -1, -1이 리턴이 됩니다. 이는 stdin에서 읽어올 문자 '2'와 '3'을 다 읽어왔기 때문입니다. 이것을 조금 더 응용하면, stdin에 있는 내용들을 모두 비우려면 어떻게 하면 되나요? 그냥, getchar의 리턴값이 -1일 때 까지 계속 읽어 오기만 하면 됩니다.