int fflush ( FILE *fp); 파일 스트림 버퍼를 비우는 함수
입력 매개 변수 리스트
fp 파일 스트림
반환 값
성공 시 0, 에러 시 EOF
출력 스트림 버퍼에 남아있는 내용을 출력 스트림에 출력하는 동작을 수행합니다. 하지만 입력 스트림에서 어떻게 동작해야 하는지는 표준 문서에서 정의하지 않았습니다.
scanf 함수처럼 포멧에 맞게 입력을 받을 때 최종 사용자의 입력 내용이 포멧 문자열보다 더 많은 내용을 포함하고 있으면 버퍼에 처리하지 않은 데이커가 남습니다. 이처럼 스트림 버퍼의 내용을 비울 때 fflush 함수를 사용합니다. 하지만 C 표준 문서를 보면 구체적인 행위를 정의하지 않았습니다.
실제 컴파일러에 따라 처리하는 방식이 다릅니다. 저자가 테스트 해 본 Microsoft Visual Studio 2010에서는 제대로 버퍼를 비우지만 Microsoft Visual Studio 2015에서는 아무런 작업도 하지 않음을 확인하였습니다. gcc나 tc 등도 버전에 따라 다르게 동작합니다.
이에 관한 다른 의견이 계시면 jejutour@daum.net 으로 메일을 보내주세요.
사용 예
//C언어 표준 라이브러리 함수 가이드 //int fflush ( FILE *fp); 파일 스트림 버퍼를 비우는 함수 //두 개의 피연산자와 연산자를 입력받아 연산 결과를 출력 #include <stdio.h> int main() { int left,right; char op; printf("왼쪽 피연산자 : "); scanf_s("%d",&left); fflush(stdin); //표준 입력 스트림 버퍼를 비워줌 printf("오른쪽 피연산자 : "); scanf_s("%d",&right); fflush(stdin);//표준 입력 스트림 버퍼를 비워줌 printf("연산자 : "); scanf_s("%c",&op,sizeof(op)); fflush(stdin);//표준 입력 스트림 버퍼를 비워줌 //입력한 연산자에 따라 연산 결과를 출력함 switch(op) { case '+': printf("%d\n",left+right); break; case '-': printf("%d\n",left-right); break; case '*': printf("%d\n",left*right); break; case '/': if(right) { printf("%d\n",left/right); } else { printf("divide zero\n"); } break; default: printf("연산 기호를 잘못 입력하였습니다.\n"); break; } return 0; }
출력(Microsoft Visual Studio 2010 이하 버전)
왼쪽 피연산자 : 23 abc (의도적으로 포멧 지정보다 많이 입력) 오른쪽 피연산자 : 12 hello (의도적으로 포멧 지정보다 많이 입력) 연산자 : + yahoo (의도적으로 포멧 지정보다 많이 입력) 35
출력(Microsoft Visual Studio 2015)
왼쪽 피연산자 : 23 abc (의도적으로 포멧 지정보다 많이 입력) 오른쪽 피연산자 : 연산자 : 연산 기호를 잘못 입력하였습니다.
이처럼 입력 스트림을 입력 인자로 fflush 함수를 사용할 때는 매우 신중하게 사용하셔야 합니다.