C언어/stdio.h

[C언어] fflush 함수 (stdio.h)

아무일도없었다 2022. 8. 4. 16:15

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 출력 stream 버퍼를 비워준다. (입력 X)

헤더

#include <stdio.h>

※ fflush 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

int fflush(FILE* file);

파라미터

  • FILE* file
    • fopen 함수를 통해 얻은 FILE의 포인터를 입력한다.
    • fopen의 read mode 로 생성된 file stream에서는 사용하지 않는다.

반환값

성공시   0을 반환한다.
실패시   EOF(-1) 을 반환한다.

잡학지식

fflush 는 개발자 자신도 모르는 사이에 여러번 사용했던 API이다.

fwrtie, fputs 처럼 file에 데이터를 기록하고 fclose 로 file stream을 닫은 후 파일을 확인해보면 파일에 데이터가 잘 저장되는것을 확인할 수 있다.

그래서 fwrite 와 유사한 API를 호출하면 파일에 바로 기록되는걸로 생각할 수 있는데 이는 잘못된 생각이다. (물론 stream의 buffering에 따라서 달라질수 있겠지만 이는 여기서 다루지 않는다.)

실제로는 fclose 내부에서 fflush 를 호출하여 file stream을 닫기전에 파일에 기록(출력)될 버퍼를 비워주기 때문이다. (여기서 비운다는 의미는 지우는게 아닌 남아있는 출력 버퍼를 파일에 옮긴다는 뜻이다.)

fwrite는 파일에 쓰는게 아닌 자기가 전달받은 data를 stream buffer에 적재하는 API이다.
따라서 fwrite 호출이후 sleep 함수로 프로그램을 잠시 재워두고(?) 파일의 내용을 확인해보면 데이터가 아직 파일에 기록되지 않는걸 확인할 수 있다.

 

<소스 코드>

#include <stdio.h>

#define MAX_BUF_SIZE 32

int main() {
    FILE *fp;
    size_t ret;
    char buffer[MAX_BUF_SIZE] = "Hello fflush";

    fp = fopen("test.txt", "w");
    if (fp != NULL) {
        // 파일에 write
        ret = fwrite(buffer, sizeof(char), strlen(buffer), fp);
        printf("[fwrite]ret = %d\n", (int)ret);
        if(ret == strlen(buffer)) {
            // fflush를 통해 fp의 출력 버퍼를 비워주면서 파일로 기록
            ret = fflush(fp);
            printf("[fflush]ret = %d\n", (int)ret);
        } else {
            // fwrite 가 데이터를 정상적으로 기록하지 못했음
        }
        fclose(fp);
    } else {
        // fopen failed
    }
    return 0;
}

 

※ 실행 결과

[fwrite]ret = 12
[fflush]ret = 0

 

< test.txt >

Hello fflush

※ fflush 함수 호출 전과 후로 sleep 함수를 사용해서 test.txt 파일에 데이터가 기록되는 시점을 확인할 수 있다.

반응형

'C언어 > stdio.h' 카테고리의 다른 글

[C언어] fprintf 함수 (stdio.h)  (0) 2022.08.07
[C언어] sprintf 함수 (stdio.h)  (0) 2022.08.07
[C언어] fwrite 함수 (stdio.h)  (0) 2022.08.04
[C언어] fread 함수 (stdio.h)  (0) 2022.08.03
[C언어] fclose 함수 (stdio.h)  (0) 2022.08.02