fwrite, fread, fgets. 이 셋의 공통점은 무엇일까요? 링크의 설명에서 보면, 공통적으로 stream 이라는 것이 들어가 있어요. 아. 듣기만 해도 어려워 보입니다. 그리고 stream에 대해서, 공식 문서의 io library에 대한 링크를 보면, 아래와 같은 문구가 있다는 것을 알 수 있습니다.

 

  쉽지 않아 보이는군요. 차근 차근 생각해 봅시다.

 


 우리가 scanf 함수로, "abcde" 라는 것을 입력받았다고 해 봅시다.

 

 

 그러면, 키보드로부터 받은 "abcde"를 프로그램 A에다가 넘겨줄 겁니다. 그러면 keyboard에서 A로 흘러갔다는 게 조금 와 닿나요? 반대로, "chogahui"를 FILE B에다가 쓴다고 해 봅시다. 그러면 어떻게 해야 하나요?

 

 

 "chogahui"가 A에서 file B로 전달이 되어야 할 겁니다. 그러면, 스트림은 대략적으로 이렇게 정의하면 좋을까요? 어느 지점에서부터 어느 지점까지 데이터가 흘러간다. 그런데 뭔가 좀 추상적인 듯 싶습니다. 그냥 데이터가 어딘가에서 어딘가로 전달되는 방법, 혹은 그러한 도구, 통로 정도만 제가 그려놓았기 때문입니다.

 

 


 그러면 키보드로부터 "abc"를 입력받았을 때, 제 프로그램에 어떻게 전달할 지 생각해 보도록 하겠습니다.

 

 

 먼저, 한 문자를 입력받는 즉시, A에 보내는 방법을 생각해 볼 수 있습니다. 예를 들어, 'A'를 입력받는 즉시, 'A'라는 문자가 A에 흘러 들어갑니다. 다음에 'B'라는 것을 받으면 어떨까요?

 

 

 

 그 즉시 A에 전달이 될 거에요. 문자를 입력받는 즉시 전달이 된다고 하면 요래 될 거에요. 그런데, 어떠한 크기나, 혹은 어떤 문자가 나타날 때 까지 A에 전달하지 않는 경우도 있을 거에요. 즉, 하나씩 보내지 않는 방법도 있을 건데요. 예를 들어서, "ABC\n"를 입력했다고 해 봅시다.

 

 만약에, '\n'이 나타날 때 까지 목적지로 보내지 않는 방법을 취했다고 생각해 봅시다. 그러면 입력을 받은 "AB"라는 것을 어딘가에 저장을 해 놓아야 할 겁니다.

 

 

 'A'를 입력 받았을 때, 어딘가에 저장을 합니다.

 

 

 다음에 'B'를 입력했을 때 어딘가에 저장해 놓습니다.

 

 

 다음에 '\n'이 들어왔습니다. 이 때,  A는 키보드로부터 "AB\n"를 읽어가지 않습니다. 단지, 어딘가로부터 "AB\n"을 읽어갑니다.

 

 

 그러면, 여기서 우리는 임시로 "AB\n"을 저장한 곳을 버퍼라고 말하면 되겠군요. 즉, 어딘가에서 어딘가로 전달할 때 버퍼를 쓸 수도 있다. 정도로 정리하시면 될 듯 싶네요. 이 정도만 일단 잡아두고, 입출력 함수들에 대해서 훑어보셔도 좋을 듯 싶습니다.