Странное поведение из-за сна () - PullRequest
3 голосов
/ 29 июля 2011

Я только знакомился со сном (), я обнаружил, что

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

}

это не печатает число за итерацию, а сбрасывает все числа, когда выходит из цикла...но когда я изменяю printf ...

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

}

и теперь, когда я добавил новую строку '\ n', она работает как положено ... почему она ведет себястранно в первом ...

Ответы [ 6 ]

7 голосов
/ 29 июля 2011

Это потому, что буфер вывода не очищается (другими словами, фактически передается на терминал).Когда вы пишете новую строку, выходной буфер, скорее всего, будет (но в некоторых случаях не всегда) очищен.Многие реализации терминалов делают это для повышения производительности.Чтобы вызвать желаемое поведение, вам нужно звонить fflush(stdout); после каждого printf вызова, например:

#include<stdio.h>
int main()
{
int i=0;
printf("*********Testing Sleep***********\n");
for(i=0;i<10;i++)
{
    printf("%d",i);
    fflush(stdout);
    sleep(1);
}
return 0;
}
3 голосов
/ 29 июля 2011

На что вы смотрите, так это строковый буферизированный вывод .На самом деле запись в вывод - дорогостоящая операция, поэтому потоки ввода / вывода обычно буферизуются .На самом деле запись в буфер откладывается до тех пор, пока не встретится конкретное событие.В стандарте C у вас есть три типа буферизации:

  • полностью буферизирован - буфер записывается при заполнении.
  • строка буферизируется - буфер пишется при встрече новой строкиcase).
  • unbuffered - буфер записывается всякий раз, когда выполняется функция ввода / вывода.(Хорошо для регистрации ошибок.)

Запись в буфер называется flushing .Вот почему есть функция stdio, которая называется fflush().Вы также можете проверить setvbuf() и его константы параметров, _IOFBF, _IOLBF и _IONBF.Я уверен, что вы можете понять, что они означают без поиска их.; -)

Редактировать: Эта программа работает так, как вы и ожидали:

#include <stdio.h>

// This is the header where sleep() is declared. Don't go without it.
#include <unistd.h>

int main()
{
    int i=0;

    // setvbuf() can be called on a stream only BEFORE
    // you do any I/O on it!
    setvbuf( stdout, NULL, _IONBF, 0 );

    printf( "*********Testing Sleep***********\n" );
    for ( i = 0; i < 10; ++i )
    {
        printf( "%d", i );
        sleep( 1 );
    }
    return 0;
}
1 голос
/ 29 июля 2011

стандартный вывод для терминалов буферизован строкой, вывод не записывается, если нет новой строки или вы не сбросили ее вручную.

0 голосов
/ 29 июля 2011

Printf буферизован.

Вы можете заставить printf очистить свой буфер с помощью вызова fflush.

или

Просто поместите буфер в стандартный вывод, используя \ n, как в вашем случае.

Более подробное обсуждение здесь

0 голосов
/ 29 июля 2011

Вывод буферизирован, так что у ОС есть возможность оптимизировать скорость вывода.Чтобы убедиться, что они немедленно сбрасываются, выполните fflush (stdout);, но обычно это не так.

0 голосов
/ 29 июля 2011

Это потому, что printf() использует буферизованный вывод для повышения производительности.Буфер сбрасывается на консоль после печати \n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...