Standard C

C 언어 fflush 사용법 완벽 가이드

레퍼러 2025. 2. 22. 13:42

fflush 함수는 C 언어에서 출력 버퍼를 비우거나, 출력 스트림의 데이터를 파일이나 출력 장치로 즉시 전달할 때 사용됩니다. 주로 표준 출력(stdout) 버퍼를 강제로 비워 출력 지연 문제를 방지하는 데 유용합니다.


1. fflush 함수 기본 문법

#include <stdio.h>

int fflush(FILE *stream);

매개변수 설명:

  • stream: 버퍼를 비울 파일 포인터입니다. 표준 출력 버퍼를 비우려면 stdout을 사용합니다.

반환 값:

  • 성공 시 0 반환
  • 실패 시 EOF 반환

2. fflush 사용 목적

  • 출력 버퍼의 내용을 강제로 출력
  • 파일 스트림의 버퍼를 디스크에 기록
  • 프로그램 충돌 시 데이터 손실 방지

3. 기본 사용 예제

#include <stdio.h>

int main() {
    printf("첫 번째 줄 출력 (버퍼에 저장됨)\\n");
    fflush(stdout); // 출력 버퍼 비우기
    printf("두 번째 줄 출력\\n");
    return 0;
}

출력 결과:

첫 번째 줄 출력 (버퍼에 저장됨)
두 번째 줄 출력

4. 실전 활용 예제

4.1. 사용자 입력 대기 시 출력 보장

#include <stdio.h>

int main() {
    printf("이름을 입력하세요: ");
    fflush(stdout); // 입력 전 출력 보장

    char name[50];
    scanf("%s", name);
    printf("안녕하세요, %s님!\\n", name);
    return 0;
}

출력 결과:

이름을 입력하세요: (사용자 입력)
안녕하세요, (사용자 입력)님!

4.2. 파일 스트림 버퍼 비우기

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (!file) {
        perror("파일 열기 실패");
        return 1;
    }

    fprintf(file, "파일에 저장할 데이터\\n");
    fflush(file); // 디스크에 데이터 강제 기록

    fclose(file);
    printf("파일 쓰기와 버퍼 비우기가 완료되었습니다.\\n");
    return 0;
}

출력 결과:

파일 쓰기와 버퍼 비우기가 완료되었습니다.

5. fflush 사용 시 주의할 점

  1. 입력 스트림 사용 제한: stdin에 대해 fflush를 사용하는 것은 표준 C에서 정의되지 않으며, 일부 구현에서는 예상치 못한 동작을 유발할 수 있습니다.
  2. 반환 값 확인: fflush가 EOF를 반환하면 오류가 발생한 것이므로 적절히 처리해야 합니다.
  3. 버퍼링 전략 이해: 파일 스트림은 버퍼링될 수 있으므로, 파일이 닫히기 전에 fflush를 호출하여 데이터 손실을 방지할 수 있습니다.

6. 오류 처리 예제

#include <stdio.h>

int main() {
    FILE *file = fopen("readonly.txt", "r");
    if (!file) {
        perror("파일 열기 실패");
        return 1;
    }

    if (fflush(file) == EOF) {
        perror("버퍼 비우기 실패");
    }

    fclose(file);
    return 0;
}

출력 결과:

버퍼 비우기 실패: Invalid argument

7. 결론

fflush 함수는 출력 버퍼의 데이터를 강제로 출력하거나 파일 스트림의 버퍼를 디스크에 기록하는 데 필수적입니다. 특히 사용자 입력 대기 전 출력 보장, 프로그램 중간 상태 저장, 예기치 않은 종료 대비 등의 시나리오에서 유용하게 사용됩니다. fflush를 적절히 사용하여 더 안정적이고 예측 가능한 프로그램을 작성해 보세요.