반응형

https://www.quora.com/When-is-the-circular-buffer-in-C-empty

입력한 버퍼를 비우는 방법에 대해서는 아래 설명했다.

https://ansan-survivor.tistory.com/1322

 

[C언어] 문자열 입력 버퍼(buffer) 비우기 함수

아래 코드는 fgets함수로 키보드로 부터 입력이 들어올 때, 모든 버퍼를 싹 비워버리는 함수다. #include void ClearLineFromReadBuffer(void); int main() { // ex) 880808'\0' 총 7개 배열 필요. char perID[7];..

ansan-survivor.tistory.com

 

출력버퍼를 비워주는 내장된 함수가 있는데 이름은 fflush( ) 이다.

반응형


※ fflush 함수는 Write에서만 가능(쓰기 모드).  즉, 출력버퍼를 비울때 사용가능하다.
    int fflush(FILE * stream);

 

    각 입출력에서 "버퍼를 비운다"의 실제 의미
* 출력버퍼를 비운다:  출력버퍼를 비운다는 말은 현재까지 저장된 모든 데이터를 '목적지(모니터, 파일)로 전송한다'
* 입력버퍼를 비운다:  입력버퍼 데이터를 소멸시킴(입력된 것을 삭제), 그러나 fflush() 함수에서는 호출할 수 없다!  -> ( getchar() 로 읽고 활용하지 않고 소멸 )

 

OS의 종류에 따라 어떤 OS는 프로그램이 전부 끝난 후에 출력이 이루어 질 수 있고, 어떤 OS는 버퍼가 비워질때 출력이 이루어지는 경우가 있다.

그래서 특정경우 출력이 반드시 필요할 때는 해당 버퍼를 비워주어야 어떤 OS든간에 출력이 가능하다.

#include <stdio.h>

// fflush는 출력버퍼를 비우는 함수 !

int main()
{
	FILE * fp = fopen("data.txt", "wt");

	fflush(fp);			//	이렇게 fclose() 함수를 호출하지 않고, 중간에 fflush()함수를 이용해서 버퍼를 비울수도 있다.

	// 하지만, 버퍼를 비운다 해도 fopen이 열리면 반드시 fclose를 하는 습관을 갖자.
	fclose(fp);

	return 0;
}

 

* 주의 visual studio에서는 입력버퍼 비울때 fflush 함수를 허용하나, 이것은 표준이 아니므로 가급적이면 사용하지 않는 것이 좋다. (해당코드가 다른 OS에서 안돌 수 있다) 즉, fflush(stdin) 이런건 사용하지 않기.

 

 

 

반응형

+ Recent posts