- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[C] 표준 입,출력과 버퍼(Buffer) 본문
■ 표준 입,출력 기반의 버퍼
scanf,printf함수,putchar,getchar함수들은 모두 표준 입,출력 함수들이다.
표준 입,출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다는 특징이 있다. 버퍼는 '여분의 임시 메모리 공간'이라고 생각하면 된다.
키보드를 통해서 입력하는 데이터는 실행중인 프로그램으로 바로 읽혀지는 것이 아니라, 일단은 입력 버퍼라는 곳에 저장이 된다. 그리고 나서 입력 버퍼에 존재하는 데이터가 프로그램으로 이동한다.
printf와 같은 함수 호출은 모니터에 데이터를 출력하려는 경우에도 바로 출력이 이뤄지는 것이 아니라, 일단은 출력 버퍼라는 곳에 저장이 되었다가 출력 스트림을 통해 모니터로 전송된다.
그렇다면 키보드로부터 입력된 데이터가 입력 스트림을 거쳐서 입력 버퍼로 들어가는 시점이 언제인가? 키보드로 데이터를 입력하고 나서 Enter키를 누르는 시점이 바로 데이터가 입력 버퍼로 들어가는 시점이다.
■ 버퍼링(Buffering)을 하는 이유는 무엇인가?
버퍼링이란 데이터를 전송 하는데 있어서 목적지로 바로 보내는 것이 아니라, 중간에 버퍼(여분의 임시 저장소)를 둬서 전송하고자 하는 데이터를 임시 저장해 두는 것을 말한다. 임시 저장된 데이터가 어느 정도 채워지면 한꺼번에 데이터를 전송하게 된다.
버퍼링을 하는 이유는 성능의 향상때문이다. 데이터를 키보드로부터 입력받거나, 데이터를 모니터로 출력하는 것은 시간이 걸리는 작업들이다. 그럼에도 불구하고 이러한 작업들(I/O)은 컴퓨터가 처리해야 하는 많은 일들과 비교해서 상대적으로 중요도가 떨어지는 작업들이다. 즉 지금 컴퓨터가 바쁘다면, 이러한 입,출력과 관련된 일들은 뒤로 미뤄도 된다는 것이다.
버퍼는 이처럼 바로! 처리해야 되는 입,출력 작업이 아니라면, 문자가 하나씩 들어올 때마다 처리를 하는 것보다는, 어느 정도 쌓아 두었다가 처리를 하는 것이 일을 효율적으로 처리하는 것이 된다.
창고에 물건을 나르는 경우 손으로 하나씩 나르는 것보다는, 리어카라도 빌려서 한꺼번에 많은 양의 물건을 나르는 것이 보다 효율적이라는 것을 알고 있을 것이다. 스트림을 기반으로 입,출력을 하는 경우, 버퍼링을 하는 이유도 이와 같은 이치이다.
■ 버퍼를 비우는 작업을 하는 fflush 함수
가끔은 입,출력작업도 긴급을 요하는 경우가 있기 마련이다. 이러한 경우에는 성능 향상을 목적으로 존재하는 버퍼링이 부담될 수 밖에 없다. 이러한 상황에서 유용하게 사용될 수 있는 fflush 함수가 있다.
#include <stdio.h>
int fflush(FILE * stream);
/* 성공 시 0, 실패 시 EOF 리턴 */
fflush 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다. 여기서 비워버린다는 의미는 전달되는 스트림의 종류에 따라서 달라진다. stdin과 같은 입력 스트림이 전달되면 입력 버퍼 안에 존재하는 데이터들은 모두 버려지게 된다(지워지게 된다) 그러나 stdout와 같은 출력 스트림이 인자로 전달되면 출력 버퍼 안에 존재하는 데이터들은 목적지를 향해서 출발하게 된다.
#include <stdio.h>
int main(void){
char perID[7]; // 6+null문자=7
char name[10];
fputs("주민번호 앞 6 자리를 입력하세요:",stdout);
fgets(perID,sizeof(perID),stdin);
fflush(stdin); // 입력 버퍼를 비운다.
fputs("이름을 입력하세요 : ",stdout);
fgets(name,sizeof(name),stdin);
printf("주민번호 앞자리: %s\n",perID);
printf("이 름: %s\n",name);
return 0;
}
만약 fflush함수로 버퍼를 비우지 않았다면 이름을 입력할 기회조차 얻지 못하고 넘어가는 것을 볼수 있다.
fget함수는 ㅍ준 입,출력 함수이므로, 함수 호출 시 키보드를 통해서 입력받은 문자들은 일단 입력 버퍼에 저장이 되낟. 그 다음 ㅣㄹ행중인 프로그램으로 문자열이 전송되는데, 입력받은 문자가 fget 함수에서 요구하는 문자의 수보다 많기 때문에 입력 버퍼에 있는 데이터는 한번에 읽혀지지 않는다. 즉, 읽혀지고 남은 문자들이 여전히 버퍼에 존재하게 된다.
그 다음 두 번째 fgets함수가 호출 될 때는 입력 버퍼에 여전히 문자가 남아 있기 때문에 키보드로부터 문자열을 입력받지 않고, 버퍼에 남아 있는 문자들을 읽어 들이게 된다. 따라서 우리가 원하는 실행 결과를 얻지 못하게 된 것이다.
'★─Programing > ☆─C | C++' 카테고리의 다른 글
[C] 난수발생 rand() 함수 사용법 (0) | 2007.08.07 |
---|---|
[C] 반복문 이용한 달팽이 배열 (0) | 2007.08.07 |
[C] 연결리스트 ( Link List ) _Linux (0) | 2007.07.12 |
[C] 개미수열 알고리즘 (0) | 2007.07.12 |
[C] Visual C++ Error 모음 (1) | 2007.07.12 |