'버퍼'에 해당되는 글 1건

  1. 2011.04.23 fflush(stdin) 타도 -_-;
Computer/Learning C / C++2011. 4. 23. 06:10
Visual C++에서만 사용 가능한 녀석이다.

fflush() 는 지정된 스트림을 비워주는 역할을 한다. (함수 자체는 표준이지만....)
표준 출력(stdout)은 간단하게 버퍼의 내용을 출력으로 다 보내버리면 비워지지만 표준 입력(stdin)은 그렇지 않다.
(잠깐 딴소리 : 그 외 출력 스트림(파일 포인터 등...)을 fflush 에 넘겨주는 경우는 stdout과 마찬가지로 해당 스트림의 목적지(?)에 버퍼에 있는 내용을 모두 밀어넣으면서 버퍼를 비운다.)

VC에서 이 기능의 구현이 어떻게 되어있는지는 알 수 없으나, 권장하고 싶지는 않은 방법이다. 물론 윈도에서만 돌아가는 프로그램일 경우 편리한 방법이겠으나, 표준이 아니므로 다른 환경에서 컴파일을 했을 때, 무슨 일이 일어날지 알 수가 없다.
GCC에서 컴파일을 해 본 결과, 컴파일 당시에는 아무런 문제가 없었으나 실제 프로그램을 돌려봤더니 해당 기능은 전혀 동작하지 않았다.

fflush(stdout) 은 표준
fflush(stdin)은 비표준이다.
프로그래밍을 처음 시작할 때 scanf를 사용하면서 발견하는 단순한 문제이지만 이를 조금 더 편하다고 해서 표준이 아닌 방법으로 해결하는것은 결코 좋은 습관이 아니라고 생각한다. 처음 시작부터 표준을 strict 하게 준수하도록 노력하는것이 조금 힘들더라도 반드시 필요한 것이 아닌가 한다.

이 스트림을 비우고 싶다면 이 곳에 남은 내용들을 모두 읽어내고 버리기 위해 다음의 코드를 사용한다.
 
#include <stdio.h>

void flush() {
	int a = 0;
	while (a != '\n' && a != EOF)
		a = getchar();
}

아무데서나 막 쓰면 실행 도중에 엔터를 두드려줘야 하는 경우가 생긴다. 필요할때만 써야한다.
간단하게 그냥 한번 건너뛰는 scanf 의 경우는 이 전에 getchar()를 한번 호출함으로써 문제를 해결할 수 있다.

그 어떤 경우에도 fflush(stdin)은 쓰지 말자고 강력하게 주장해본다...(응?)

'Computer > Learning C / C++' 카테고리의 다른 글

출력 스트림과 endl  (0) 2011.05.21
fflush(stdin) 타도 -_-;  (0) 2011.04.23
GCC on iOS 4.2.1  (6) 2011.04.05
Posted by Adward

댓글을 달아 주세요