`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— 파일 닫기