#include <stdio.h>
int main(void)
{
char ch;
while((ch = getchar()) != '#')
putchar(ch);
return 0;
}
1. 상황별 버퍼의 출력
: 버퍼는 임시 저장소이다. 위 예제의 경우 어떤 시스템에서는 키보드 입력시 에코가 바로 되고 또 어떤시스템에서는 엔터값 입력시 프로그램에 제공(출력) 되는경우가 있다. 입력 문자가 즉시 에코되는 상황은 입력된 문자가 버퍼에 저장되지 않는경우에 발생하고 엔터가 입력되어야 에코가 되는 상황은 먼저 버퍼에 저장될 때 발생한다.
2. 버퍼는 왜 있나?
: 첫째, 문자의 전송을 한 문자씩 해 주는 것보다 여러 문자를 동시에 전송시키는 것이 더 빠르기 때문이고, 둘째, 입력을 잘못 하더라도 키보드에서 쉽게 고칠 수 있기 때문이다. 그래서 엔터키를 누르면 수정된 데이터가 입력되는 것이다.
어떤 경우는 버퍼를 사용하지 않아야 적합한 경우가 있다. 바로 게임인것이다. 입력시 키보드 값이 즉시적용이 되어야 하기 때문이다.
3. 버퍼의 종류
- 전체 버퍼 입출력
: 버퍼가 꽉찼을 때 비워지는데 이러한 종류의 버퍼링은 주로 파일 입.출력시 주로 발생한다. 이 때 버퍼의 크기는 시스템 마다 다르지만 보통 512byte나 4096byte가 사용된다.
- 라인 버퍼 입출력
: 개행 문자가 입력되면 버퍼가 비워진다. 키보드로 입력하는 경우 주로 라인 버퍼 입력 방식이 사용된다. 그래서 엔터를 입력해야 버퍼가 비워진다.
4. 버퍼 종류의 결정 방법
: ANSI C 표준에 따르면 입려은 버퍼가 되어야 한다고 규정하고 있다. 하지만 K&R C에서는 컾일러 설계자가 선택할 수 있었다. 자신의 시스템이 어떻게 작동하는지는 맨위 예제 소스를 실행하면 알수있다.
ANSI C에서 입력 버퍼링을 표준으로 지정한 이유는 버퍼되지 않는 입력 자체를 허용하지 않는 컴퓨터 시스템들이 있기 때문이다. 만약 시스템이 입력하면 버퍼되지 않는 것을 허용한다면 컴파일러가 이것을 선택사항으로 허용할지도 모른다. IBM호환 기종의 컴퓨터에서 사용되는 컴ㅍ일러는 보통 입력해서 버퍼되지 않아도 되는 기능을 지원하기 위해 conio.h 군의 함수들을 제공 하고 있다.이 중에 버퍼링이 발생하지 않은 상태에서 에코를 해주는 함수는 getche()함수이고 버퍼링도 되지 않고 에코도 되지 않도록 해 주는 함수는 getch() 이다. 여기서 에코가 되지 않는 다는 것은 입력된 문자가 모니터에 나타나지 않는다는것이다. UNIX 시스템에서는 다른 저븐 방식을 사용하는데, 입력 문자를 지정하기 위해서 ioctl()함수를 사용한다. 이 함수는 UNIX 라이브러리에는 포함 되어 있지만 표준 C의 일부는 아니다. 이 목적을 위해 getchar()도 사용될 수 있다. ANSI C 에서는 버퍼링 통제를 위해 setbuf()함수와 setvbuf()함수를 사용하지만 시스템에 따라서 제약을 받을 수도 있다. 즉, 표준 ANSI에서는 버퍼되지 않은 입력을 불러올 방법이 존재하지 않는다. 이는 컴퓨터 시스템에 의존한다는 것을 뜻한다.
댓글 없음:
댓글 쓰기