fflush 함수

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 함수를 사용할 때는 매우 신중하게 사용하셔야 합니다.