fflush(stdin) 정도는 책을 보시면서 한 두번쯤은 보셨을 거에요. 가끔, 왜 이 함수를 썼는데 동작을 하지 않느냐. 는 질문도 더러 받아본 적이 있습니다. 원형은 다음과 같습니다.

 

 하도 많이 언급이 되다 보니, 그냥 안 보고도 이 함수를 쓰시는 분들이 적지 않게 계실 듯 싶기도 합니다. 코드포스 interactive 문제를 많이 보셨다면, fflush 정도는 많이 써 보셨으리라 생각이 드니, 사용법은 생략해도 무난할 듯 싶습니다.

 

 


 그런데, 링크에서 보면, 이런 문구가 있습니다.

 

 인풋 스트림에 대해서는, 동작이 정의되지 않는다고 설명이 되어 있습니다. 이것 하나만으로 답변이 끝났네요. stdin은 표준 입출력을 의미합니다.

 

 

 이것 또한 input과 관련된 것입니다. 따라서, 동작이 정의되지 않고, 결과값 또한 정의되지 않습니다. 사실, 의도하는 기능을 더 좋은 방법으로 구현할 수 있는 방법이 있습니다. 예를 들어서, 이런 프로그램을 생각해 봅시다.

 

 

 이 프로그램은 age와 성별을 받아서, 그것들을 출력해 주는 프로그램입니다. age와 성별을 아래와 같이 입력을 받아 보겠습니다.

 

 

 그러면 프로그램이 예상대로 동작할까요? 아닙니다. scanf가 정수를 하나 읽어가면, 버퍼에 다음과 같은 내용이 남습니다.

 

 

 여기서, 문자 하나를 읽는다면, '\n'이 있기 때문에, '\n'을 읽어갑니다. 'M'을 읽지 않습니다. 여기서 'M'을 읽게 하기 위해서는 입력 버퍼에 있는 내용을 비워야 합니다. 이 때, 어떻게 해야 하느냐가 문제인데요.

 

 

 getchar 함수로 읽어내면 됩니다.

 

 

 그러면, 의도대로 성별과 나이를 읽어낼 수 있습니다. 입력 버퍼를 비우기 위해서, fflush(stdin)보다 좋은 대안이 있습니다. 심지어, 터미널은, seekable하지 않습니다.

 

 


 출력과 관련된 stram에 대해서는 어떻게 동작할까요? 자세한 것은 알 필요 없습니다. 다만, 링크에 언급된 이 문구를 보실 필요가 있습니다.

 

그리고, disk에 실제로 저장이 되려면, 이것 말고도 커널 버퍼가 플러시 되어야 한다는 문구가 나옵니다. 그런데, fflush는 커널이 아닌, 유저 레벨의 버퍼만 플러시 합니다. 그러면 실제로, 디스크에 써질 수도 있겠지만, 그 내용이 써지지 않을 수도 있다는 것입니다. disk에 써지려면, 커널 수준의 버퍼가 플러시 되어야 한다는 문구도 나오는데요. 그러면서 언급되는 함수가 sync()나, fsync()입니다.

 

 

 여기서, sync, fsync 등은, 디스크와 버퍼의 내용을 일치시키기 위해 쓰입니다. 다른 글에 비해서 그리 길지는 않았습니다만, 요약하면, fflush는 input stream에는 쓰지 않는다. 정도 알아가시면 좋을 듯 싶습니다.