`fflush` 함수

fflush 함수 (fflush)

프로그램이 뭔가를 출력했는데 그게 파일에 바로 반영되지 않는 경험, 한 번쯤 있죠? C의 입출력 스트림은 기본적으로 데이터를 조금씩 모아 두었다가 한꺼번에 내보내는 버퍼링을 해요. 그래서 "실제로 파일에 써라"고 직접 지시해 주는 함수가 필요한데, 그 역할을 하는 게 fflush예요.

출처: cppreference

본문

함수 원형

<stdio.h>에 정의돼 있어요.

int fflush( FILE* stream );

설명 (Explanation)

출력 스트림(그리고 마지막 연산이 출력이었던 갱신(update) 스트림)에 대해, 버퍼에 남아 있으면서 아직 내보내지 않은 데이터를 모두 실제 출력 장치로 써 내려요.

입력 스트림(그리고 마지막 연산이 입력이었던 갱신 스트림)에 fflush를 호출하는 것은 동작이 정의되지 않아요(undefined behavior).

stream이 널 포인터면 열려 있는 모든 출력 스트림을 flush해요. 라이브러리 패키지가 관리하거나 프로그램에서 직접 접근하지 못하는 스트림까지 포함해서요.

매개변수 (Parameters)

  • stream — 써 내보낼 파일 스트림

반환값 (Return value)

성공하면 0을 돌려줘요. 실패하면 EOF를 돌려주고 해당 파일 스트림의 오류 표시(error indicator)를 설정해요.

주의할 점 (Notes)

POSIX는 입력 스트림에 대한 fflush의 동작도 정의로 확장해요. 그 스트림이 파일이나 다른 탐색 가능한(seekable) 장치를 나타낸다면, POSIX 파일 포인터를 C 스트림 포인터에 맞게 재배치해요(사실상 읽기 버퍼링을 되돌리는 셈). 아직 읽어들이지 않은 ungetc/ungetwc의 효과는 버려져요.

Microsoft도 입력 스트림에 대한 fflush의 동작을 확장해요. Visual Studio 2013 이전에서는 입력 버퍼를 버렸고, 2015부터는 아무 효과 없이 버퍼를 유지해요.

같이 보기 (See also)

  • fopen — 파일 열기
  • fclose — 파일 닫기