fflush
헤더 파일
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - STDIO.H
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 함수를 사용할 때는 매우 신중하게 사용하셔야 합니다.
사용한 함수
[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - printf
'언어 자료구조 알고리즘 > C11 표준 라이브러리 함수' 카테고리의 다른 글
ferro 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
---|---|
fseek 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
ftell 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
fread 함수 [C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
fwrite 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
vprintf 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
sscanf_s 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
sscanf 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
sprintf_s 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |
sprintf 함수[C언어 표준 라이브러리 함수 가이드] (0) | 2016.01.03 |