2012-09-16 4 views
41

fflush() 출력 스트림인데도 버퍼를 플러시하지 않아야합니까?C에서 플러시 버퍼

무엇에 유용합니까? 어떻게 버퍼를 일반적으로 플러시합니까?

+0

에 대한 자세한 내용은 here를 참조하십시오, 입력 스트림에 사용할 수 없습니다 동작을 정의되지 것이라고. – Lundin

+0

@Lundin 출력 스트림을 플러시하는 데 사용할 수 있습니까? – saadtaame

+2

@saadtaame 네, 그게'fflush()'의 목적입니다. – Mysticial

답변

75

필자는 출력 버퍼를 플러시하지 않는다는 말을 들어 본 적이 없으며, 이에 대한 소식을 듣고 싶습니다. 출력 버퍼를 비우기 :

printf("Buffered, will be flushed"); 
fflush(stdout); // Prints to screen or whatever your standard out is 

또는

fprintf(fd, "Buffered, will be flushed"); 
fflush(fd); //Prints to a file 

은 매우 도움이 기술이 될 수 있습니다. 왜 출력 버퍼를 플러시할까요? 보통 내가 할 때, 그것은 코드가 충돌하고 뭔가를 디버깅하려고하기 때문입니다. printf()을 호출 할 때마다 표준 버퍼가 인쇄되지 않습니다. 버퍼가 가득 찰 때까지 기다렸다가 한꺼번에 덤프합니다. 따라서 충돌 전에 함수 호출을하는지 확인하려고한다면 printf에 "도움이됩니다!"와 같은 오류가 발생하기 전에 버퍼가 플러시되지 않은 경우가 있습니다. 당신이 실제로 얼마나 멀리 왔는지 말해봐.

또 다른 시간은 멀티 프로세스 또는 멀티 스레드 코드입니다. 다시 버퍼가 printf()에 대한 호출에서 항상 플러시되는 것은 아니므로 여러 프로세스의 실제 실행 순서를 알고 싶다면 매 인쇄마다 버퍼를 fflush해야합니다.

나는 습관을 버려 디버깅에 많은 골칫거리를 덜어 준다. 내가 생각할 수있는 단점은 printf()이 값 비싼 작업 (기본적으로 버퍼를 플러시하지 않는 이유)입니다.


는 지금까지 입력 버퍼 (stdin)를 세척, 당신은 그렇게해서는 안된다. 플러싱 stdin는 C11 표준에 따라 정의되지 않은 동작이다 §7.21.5.2 2 부 :

출력 스트림으로 스트림 점 ...을 FFLUSH 함수는 그 스트림에 대한 않은 데이터가 발생하면 ...로 기록 될 파일; 그렇지 않으면 동작이 정의되지 않습니다. 당신이 fflush() man 페이지에서 볼 수 있듯이 일부 시스템

는 리눅스가 하나되는, 거기에 정의 된 행동입니다하지만 코드가 이식되지 않도록 그것은 의존 시스템입니다.

이제 가비지가 입력 버퍼에 "고정"되어 있다고 걱정하면 fpurge()을 사용할 수 있습니다. 그냥 전용 출력 스트림에 대해 잘 정의되는 FFLUSH주의 fflush()fpurge()

+1

고마워요! 어떨 때는 표준 버퍼 (또는 다른 버퍼)를 사용합니까? – saadtaame

+0

아마도 내 편집 (마지막 단락)을 참조하십시오. – Mike

+0

'fflush (stdin)'사용은 VS08/10에서 가장 잘 작동합니다. 그것이 "잘 정의 된"것인지 아닌지는 모르겠습니다. 그것은 VS에서 "픽스"일 수 있습니다. 리눅스에서 작동하지 않을 것이 확실하기 때문입니다. – ChiefTwoPencils