답변
필자는 출력 버퍼를 플러시하지 않는다는 말을 들어 본 적이 없으며, 이에 대한 소식을 듣고 싶습니다. 출력 버퍼를 비우기 :
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()
고마워요! 어떨 때는 표준 버퍼 (또는 다른 버퍼)를 사용합니까? – saadtaame
아마도 내 편집 (마지막 단락)을 참조하십시오. – Mike
'fflush (stdin)'사용은 VS08/10에서 가장 잘 작동합니다. 그것이 "잘 정의 된"것인지 아닌지는 모르겠습니다. 그것은 VS에서 "픽스"일 수 있습니다. 리눅스에서 작동하지 않을 것이 확실하기 때문입니다. – ChiefTwoPencils
에 대한 자세한 내용은 here를 참조하십시오, 입력 스트림에 사용할 수 없습니다 동작을 정의되지 것이라고. – Lundin
@Lundin 출력 스트림을 플러시하는 데 사용할 수 있습니까? – saadtaame
@saadtaame 네, 그게'fflush()'의 목적입니다. – Mysticial