본문 바로가기

Code.D IT 강좌/C언어

fflush 함수, fflush(stdin)/fflush(stdout) 개념 제대로!

C언어 강좌

fflush 함수, fflush(stdin)/fflush(stdout)



관련 글

[C언어 강좌] scanf 함수/fflsuh 함수



위의 글에서 fflush함수를 대략적으로만 다뤘었죠.

오늘은 개념을 조금 더 파고들어서, fflush(stdin)fflush(stdout)을 비교하여 다루려고 합니다.

우선 시스템과 입·출력 장치와의 관계를 살펴보겠습니다.



<출처: http//mintnlatte.tistory.com/411>



표준 입력 함수를 사용할 경우 입력 버퍼를,

표준 출력 함수를 사용할 경우 출력 버퍼를 제공받게 됩니다.

한 번에 바로 입력받고 출력하면 되지 왜 굳이 임시로 데이터를 저장하는 버퍼를 만들까요?

그 이유는 문자 하나하나를 입력받아서 바로바로 처리하는 것보다 

버퍼에 데이터를 저장하여 쌓아둔 후 처리하면 일의 효율이 훨씬 높기 때문이죠!



※ 참고

표준 출력 함수

printf() - 다양한 형태의 데이터를 출력하는 함수

putchar() - 한 개의 문자를 출력하는 함수

puts() - 문자열을 출력하는 함수

표준 입력 함수

scanf() - 다양한 형태의 데이터를 입력받는 함수

getchat() - 한 개의 문자를 입력받는 함수

gets() - 문자열을 입력받는 함수



버퍼에 데이터가 남게 되면 정상적인 입출력을 하지 못하기 때문에 

fflush()함수를 이용하여 버퍼에 있는 데이터를 비워줘야 합니다.

fflush()함수 안에 두 가지 스트림의 종류가 존재합니다.


입력 스트림(stdin) 

입력 버퍼 안에 존재하는 데이터를 비우는 즉시 삭제합니다.


출력 스트림(stdout)

출력 버퍼 안에 존재하는 데이터를 비우는 즉시 출력합니다.

(버퍼에 있는 데이터를 비운다는 게 헷갈리신다면, 

버퍼에 있는 데이터를 꺼내 출력장치로 보낸다고 생각하시면 됩니다.)



데이터를 입력하고서 엔터(Enter)를 치는 순간 입력 버퍼에 저장됩니다.

이 때 개행문자(Enter)도 함께 입력 버퍼에 저장되게 되는데 출력할 땐 출력되지 않고 

입력 버퍼에 그대로 남아있게 됩니다. 예를 들어보겠습니다.

숫자 "12345"라는 데이터를 scanf()를 이용해서 입력하면 

개행문자까지 포함하여 "12345\n"라는 데이터가 입력 버퍼에 저장됩니다.

그러나 출력될 땐, "12345"라는 데이터만 출력되고 입력 버퍼엔 "\n(개행문자)"가 남게 됩니다.

이를 처리하기 위해서 쓰이는 게 fflush(stdin)입니다.



관련 문제

[C언어 문제] 지정 배수의 합계 구하는 프로그램