2012-07-05 4 views
3

첫 번째 코드를 실행하고 Ctrl-c를 누르면 즉시 45이 파일에 기록됩니다. 하지만 두 번째 코드를 실행하면 45이됩니다.c에서 stdout의 버퍼링 동작

아래의 코드에서이 문제가 발생하는 이유는 무엇입니까? stdout이 줄 바꿈이라면 문자를 입력 한 후에 출력해서는 안됩니까? 내가 뭘 놓치고 있니?

첫 번째 코드 :

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    fp=fopen("myfile","w"); 
    fprintf(fp,"%d",45); 
    getchar(); 
    // return 0; 

} 

두 번째 코드 :

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    fprintf(fp,"%d",45); 
    getchar(); 
    // return 0; 

} 

PS : 나는 GCC를 사용하고 있는데 플랫폼이 리눅스이다.

답변

0

혼란을 일으키는 것은(),이 표준 출력 플러싱됩니다 호출 할 때처럼 보인다 getchar가 뭐죠.

getchar()sleep(10)과 같이 바꾸면 45가 인쇄되지 않습니다.

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp=stdout; 
    //fp=fopen("myfile","w"); 
    fprintf(fp,"%d",45); 
    sleep(10); 
    //getchar(); 
    // return 0; 

} 
+0

반드시 그렇지는 않습니다. '45'는 인쇄되거나 인쇄되지 않을 수 있습니다. 친절하게 내 대답을 참조하십시오. –

-4

실제 파일에 쓰는 첫 번째 경우입니다. fopen, fclose는 버퍼링 됨 I/O는 구현에 따라 다르며 버퍼가 가득 찰 때까지 데이터가 즉시 커밋되지 않을 수 있습니다. fclose()를 호출하면 버퍼가 디스크에 기록됩니다.

STDIO에 쓰고 STDIO에 쓰여진 데이터는 일반적으로 즉시 나타납니다.

+1

-1 : stdout에 기록 된 데이터는 일반적으로 "즉시"나타나지 않지만 다른 파일과 마찬가지로 라인 버퍼됩니다. –

+0

** STDIO가 정상적으로 표시됩니다. ** 잘못된 것입니다. stdout은 라인 버퍼입니다. – tuxuday

+0

stdio는 라인 버퍼링 됨 – Aftnix

4

getchar은 첫 번째 코드에서 관찰하는 버퍼링과 관련이 없다고 생각하지 않습니다. 어떤 문자를 누르지 않고 잠시 기다리면 (즉, getchar() 안에 머 무르십시오) 빈 파일이 표시됩니다. 이는 getchar, sleep 또는 while(1)으로 프로그램을 정지했는지 여부와 관계없이 발생합니다.

이제 프로그램에 처리기가 등록되어 있지 않아 프로그램이 갑자기 종료되는 Ctrl-C을 누릅니다. 갑작스런 프로그램 종료시 버퍼/스트림 플러시 여부는 구현 정의입니다. 여기에 전체 이야기

예를 들어

Why is data not being flushed to file on process exit?

을 읽고, 내 시스템에 (윈도우 7, 내부적으로 gcc가와와 Mingw 프레임 워크를 사용하는 코드 블록), 나는 45 실제로 getchar를 사용하거나에 관계없이 파일로 플러시되는 것을 볼 수 있습니다 내가 갑자기 그것을 끝낼 때 아무거나. 즉, 시스템에서 갑자기 프로그램을 종료 할 때 파일에 데이터가 플러시됩니다.

그래서 결론은 비 정상적인 방식으로 일을하면 구현이 정의됩니다.

는 그러나 두 번째 경우는 실제로 getcharstdout 버퍼를 플러시하는 것 같다 호기심 하나입니다.getchar이/flush 될 것으로 보이는 정확한 원인을 발견하자마자 업데이트 할 것입니다. stdout 버퍼

+0

감사합니다 the information.But 이유는 stdout이 버퍼링 된 것으로 가정되는 두 번째 코드에서 이상하게 행동하는 이유를 알고 싶었지만 그런 식으로 행동하지 않았습니다. – Dhatri