본문 바로가기
컴퓨터 공학/C, C++

[ C ] 문자열 함수 이해하기5_표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기

by hahehohoo 2020. 7. 22.
반응형

 

C언어 표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기

 

 

■ 입출력 버퍼(buffer)의 개념

우리가 이제껏 공부해 온 입출력 함수들은 ANSI C의 표준에서 정의된 함수입니다. 이런 표준 입출력 함수를 통해서 데이터를 입출력하는 경우, 해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다. 여기서 말하는 '메모리 버퍼'는 데이터를 임시로 모아두는(저장하는) 메모리 공간입니다. 

 

위 그림을 보면 키보드를 통해 입력되는 데이터는 일단 입력버퍼에 저장된 다음에(= 버퍼링 된 다음에) 프로그램에서 읽혀지는 것을 알 수 있습니다. 즉 fgets 함수가 읽어 들이는 문자열은 입력 버퍼에 저장된 문자입니다. 그럼 언제 입력 버퍼에 데이터가 들어가는 걸까요? 바로 엔터 키가 눌리는 시점입니다. 그래서 키보드를 아무리 문자열을 입력해도 엔터 키 누르기 전까지는 아무 반응이 없는 것입니다. 더나아가 엔터 키 누르기 전에는 입력 버퍼가 비워져 있는 상태라는 것도 알 수 있습니다. 

 

 

■ 버퍼링(buffering)하는 이유 

데이터를 목적지로 바로 보내지 않고 중간에 출력버퍼와 입력버퍼를 거치는 이유는 무엇일까요? 바로 '효율성'입니다. 쇼핑할 때 물건 하나씩 집어서 계산대에 갖다두는 것보다 카드에 다 담아서 옮기는게 빠르고 효율적이니까요. 입출력 과정에서 버퍼링을 했을 때 보다 빠르고 효율적인 이유는 이와 같은 원리입니다.

 

 

출처: https://united-shoppingcarts.com/product/model-usc550plastic-shopping-cart/

 

■ fllush 함수란?

원래 flush는 '물로 씻어 버리다'라는 의미입니다. fllush 함수 역시 버퍼를 비우는 역할을 합니다. '입력버퍼가 비워진다' 와 '출력버퍼 비워진다'는 개념적으로 차이가 있으니 잘 구분하시길 바랍니다. 

 

출처: https://clipartstation.com/flush-clipart-6/

 

 

■ 출력 버퍼 비우는 방법

출력 버퍼가 비워진다는 것은 출력버퍼에 저장된 데이터가 버퍼를 떠나서 목적지로 이동됨을 뜻합니다. 그런데 출력 버퍼가 비워지는 시점은 시스템이나 버퍼의 성격에 따라 달라집니다. 즉, 버퍼가 비워지는 시점은 항상 같지 않기 때문에 fflush 함수를 활용하면 됩니다. 이 함수는 파일을 대상으로도 호출이 가능합니다.

 

fflush(stdout);

 

 

 

 

■ 입력 버퍼 비우는 방법

입력 버퍼가 비워진다는 것은 데이터의 소멸을 의미합니다. 가끔 입력버퍼에 남아있는 불필요한 데이터를 소멸해야 할 때가 있습니다. 그 때 fflush 함수를 사용할 수 있습니다. 

 

fflush(stdin);

 

사실 fflush 함수는 출력버퍼를 대상으로 하는 함수입니다.  C언어의 표준에서는 입력 버퍼에 사용했을 때 어떤 결과가 나올지에 대해 정의하지 않습니다. 컴파일러마다 다른 결과가 나올 수 있는 것이지요. 그래서 따로 함수를 작성하여 사용할 수 있습니다. 예로 버퍼에 남아있는 '\n'를 지우고 싶다고 하면 다음과 같이 정의할 수 있습니다. 

 

void ClearLineFromReadBuffer(void)
{
   while(getchar() != '\n');
}

 

입력 버퍼에 저장된 문자들은 읽어 들이면 지워집니다. 그래서 \n을 만날 때까지 getchar() 함수를 호출합니다. 

 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

반응형


댓글