[C언어] 표준 입 출력과 버퍼(Buffer)

표준 입 출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다는 특징이 있다.


버퍼 = 여분의 임시 메모리 공간.


키보드를 통해서 입력하는 데이터는 실행중인 프로그램으로 바로 읽혀지는 것이 아니라, 일단은 입력 버퍼라는 곳에 저장이 된다는 것을 알 수 있다.

그리고 나서 입력 버퍼에 존재하는 데이터가 프로그램으로 이동하는 것이다.



프로그램상에서 printf와 같은 함수 호출을 통해서 모니터에 데이터를 출력하려는 경우에도 바로 출력이 이루어지는 것이 아니라, 일단 출력 버퍼라는 곳에 저장이 되었다가 출력 스트림을 통해서 모니터로 전송된다.




버퍼링(Bufferint)을 하는 이유는?


버퍼링이란 데이터를 전송하는데 있어서 목적지로 바로 보내는 것이 아니라, 중간에 버퍼(여분의 임시 저장소)를 둬서 전송하고자 하는 데이터를 임시 저장해 두는 것을 말한다.


임시 저장된 데이터가 어느정도 채워지면 한꺼번에 전송한다. -> 성능 향상을 위해서임.



fflush 함수 ?


버퍼를 비우는 작업을 하는 함수.


fflush 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다.


stdin 과 같은 입력 스트림이 전달되면 입력 버퍼 안에 존재하는 데이터들은 모두 지워진다.


stdout과 같은 출력 스트림이 전달되면 출력 버퍼 안에 존재하는 데이터들은 즉시 출력된다.


 

 fgets함수는 표준 입, 출력 함수이므로, 함수 호출 시 키보드를 통해서 입력받은 문자들은 일단 입력 버퍼에 저장이 된다. 
그 다음 실행중인 프로그램으로 문자열이 전송되는데, 입력받은 문자가 fgets 함수에서 요구하는 7문자보다 많기 때문에 입력 버퍼에 있는 데이터는 한번에 읽혀지지 않는다. 

즉 읽혀지고 남은 문자들이 여전히 버퍼에 존재하게 된다. 

 그 다음 두 번째 fgets함수가 호출될 때는 입력 버퍼에 여전히 문자가 남아 있기 때문에 키보드로부터 문자열을 입력받지 않고, 버퍼에 남아 있는 문자들을 읽어들이게 된다. 따라서 우리가 원하는 실행결과를 얻지 못하게 된다.