c언어 printf()에 관한 질문입니다^^;

seonghoons의 이미지

#include <stdio.h>
 
int main()
{
    int i = 0;
    for (i=0; i<10; i++)
    {
        printf("%d", i);
        sleep(1);
    }
    return 0;
}

소스코드가 엄청 간단하죠^^; 그런데 궁금한점이 생겼습니다.
for문으로 printf()호출을 1초간격으로 10번 호출 하는데요
예상했던 결과는 1초에 한번씩 0부터 9까지 출력을 한다는 것이었습니다.
하지만 실행결과 10초동안 화면에 출력이 없다가 10초후에 0~9까지 한방에
출력되더군요...

#include <stdio.h>
 
int main()
{
    int i = 0;
    for (i=0; i<10; i++)
    {
        printf("%d\n", i);   // printf() 문자열에 \n 추가...
        sleep(1);
    }
    return 0;
}

위의 코드로 실행해 봤더니 1초에 한번씩 예상했던 결과가 나오네요..

\n 이 라인을 바꿔주는 것말고 표준출력스트림을 비우는 역할도 하는 것인지 궁금합니다.

\n말고 \r , 이나 \t 로도 해봤는데 다른 것들은 10초 기다렸다가 출력해주네요^^;

설명 좀 해주실 분 계신가용??^^

klutzy의 이미지

스트림에 들어오는 데이터를 바로바로 쓰는 것보다 어느 정도 모아서 쓰는 게 효율이 높기 때문에, printf 등의 C 스트림 관련 함수에서는 버퍼링 구조를 가지고 있습니다. (그래서 write()같이 버퍼링이 없는 저수준 함수와 printf를 섞어 쓰면 희한한 결과가 나오기도 합니다.)

물론 바로바로 출력해줘야 할 경우도 있는데, 이 때는 fflush()를 이용해 주시면 됩니다.

dalili의 이미지

버퍼 구조는 3가지가 있습니다
fully buffer, line buffer, unbuffer

표준입출력 stdio와 stdout은 fully buffer이고, 표준에러 stderr는 unbuffer 입니다

시스템콜은 user모드에서 kernel모드로 바꿔서 실행해주는 것인데, 이게 오버헤드가 있기 때문에 최대한 적게 실행되도록 해주게 되어 있습니다.
printf는 시스템콜 함수인 write함수를 최대한 적게 사용하기 위해서 fully 버퍼를 사용합니다.

setbuf()나 setvbuf() 함수를 사용해서 버퍼 모드를 변경할 수도 있습니다.

seonghoons의 이미지

많은 도움이 되었습니다~^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.