[완료]printf(" ~~~ ");과 printf(" ~~~~ \n "); 의 차이
글쓴이: wodnrrns / 작성시간: 수, 2011/04/20 - 3:26오후
#include <stdio.h> void test() { printf("test module"); fflush(stdout); while(1); } int main() { printf("program start"); fflush(stdout); test(); return 0; }
이 상황에서 main의 print문과 test()함수의 print 문이 출력되지 않는이유는 뭘까요?
(출력단 바로뒤에 fflush(stdout); 도 해보았지만 똑같네요.)
printf(""); 문 안쪽에 개행문자 \n을 넣으면 출력이 또 되네요.
컴파일러는 gcc 4.2.1 버전 MacOS 10.6에서 테스트 해 보았습니다.
(제가 질문 내용을 수정하였습니다. 댓글 내용과 다른점 이해해 주세요.)
뭔가 다른걸까요?
Forums:
...
저는 출력이 잘 되는거 봐서 c 문법적인 차이는 없는거 같네요...
Qt 4.7.0 으로 빌드하니 보이는데요.
보여요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
flush(stdout)
버퍼상의 문제인듯.
음냐..
정확한 이유는 모르겠지만..
printf("test module");
이걸
printf("test module\n");
으로 바꾸니 출력이 되는군요.
먼가.. 심오한..ㅎㅎ
음 ..
buffered i/o 로 검색해 보세요.
stream buffer 를 이용하는 i/o 함수들은 direct 로 출력되지 않고, buffer 에 저장되었다가..
\n 과 같은 flush 조건을 만나거나, 강제로 flush 시켰을 때에 출력됩니다.
fflush(), setbuf() 함수도 살펴보시면 참고가 될 겁니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
printf('**\n"); 과 printf("***"); 의 차이는?
위의 분 말씀데로 while 문의 차이가 아니라 프린트문 뒤에 개행 문자의 유무에 따라서 결과가 달라지네요.
흠.. 글은 우선 해결로 두고 제가 버퍼 부분 찾아서 다시 추가해 놓겠습니다.
(댓글을 너무 성의없이 쓰시는 분들이 있네요. 예전엔 안그랬는데...ㅠ_ㅠ)
dd
데→대
stdout 의 버퍼정책 때문
찾다가 kldp의 예전 스레드를 찾았네요.
저오 아직 공부중이긴 하나 오해의 소지가 있을까봐 관련 스레드 링크합니다.
http://kldp.org/node/34334
각설하고 정리하면 표준 출력의 버퍼링 모드에 따라서 출력이 되시는 분도있고 안되시는 분도 있을것 같네요.
흠.. 그냥 간단한 에러출력이나 flag의 출력에도 생각보다 많은걸 신경써줘야 한다는것을 이번 기회에
배운 것 같네요.
답변주신 분들 감사합니다.
자기 환경에서 된다고 올리는것도
심지어는 환경 공개를 안하시더라도 그것만으로도 큰 도움이 될 때도 있습니다.
적어도 코드가 무조건 틀린 게 아니라는 것은 알수있으니까요.
성의 없는 답변 달거면 답변 달지 말라는 것처럼 들려서.. ^^;; 그런것도 도움이 된다는 의견 한표..
제가 인터넷 커뮤니티에서 가급적 보고싶지 않은 말중 하나가 "예전엔 안그랬는데.."입니다.
이거는 최근에 유입되신 분들에게 굉장한 자괴감을 주거든요.
마치 나때문에 그렇다는 것처럼 들려서 말이죠.
사실은 그냥 사람이 많아졌기 때문일 뿐인데..
발전가능성이 있는 대개의 커뮤니티가 비슷한 과정을 겪습니다.
과거의 분위기가 그리울 수 있다는 것 이해 못하는 바는 아니지만,
그닥 도움은 안되는 표현이라 생각합니다.
--
이걸보니 예전 기억이 나네요. mpi 프로그래밍을
이걸보니 예전 기억이 나네요.
mpi 프로그래밍을 포트란으로 짰었는데, 구버전 g77에서는 아무런 문제가 없다가 신버전의 g77에서 mpi프로그램이 표준출력 동작을 이상하게 하는 것이었습니다.
알고보니 g77의 동작이 바뀌어서 내부적으로 fflush()를 제대로 안해주고 있더라는...
g77소스를 바꿔서 fflush()동작이 항상 일어나도록 바꿔주니 예전처럼 정상작동;;
g77 말고 다른 포트란 컴파일러의 경우는 문제 없고
댓글 달기