2014-09-02 3 views
2

Я не могу понять, почему следующий код работает так. Я имею в виду: вместо того, чтобы печатать «привет» после каждой второй задержки ... он ждет 5 секунд и сразу отобразит hellohelhelhelhelhelhelhello.спать внутри петли

#include <stdio.h> 

int i; 
for(i=0; i<5; i++) { 
    printf("hello"); 
    sleep(1); 
}  
+0

Вам нужно промывать стандартный вывод как-то. http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin –

+1

Вы не указали свой код в функции 'main' ... Вы действительно скомпилировали и выполнили это? – Jay

ответ

4

printf Не печатайте немедленно, вместо этого он кэширует его по строке.

Добавить «\ n» (новая строка) добавить конец строки printf("hello\n"); или использовать функцию записи вместо write(STDOUT_FILENO, "hello", sizeof("hello"));.

9

Выход printf() (stdout) является строковым буферизированным по умолчанию, если выход идет в tty. Вам нужно один из

printf("hello\n"); 

или

printf("hello"); 
fflush(stdout); 

Последнее будет явно промывать выход каждой итерации.

3

Вы пишете на стандартный вывод (stdout), который является буферированным. Если вы хотите, чтобы содержимое было немедленно распечатано, вы можете очистить вывод или вставить новую строку.

Вы можете добавить \n до конца вашей строки так, чтобы напечатать строку - изменить printf линию:

printf("hello\n"); 

Для промывки stdout буфера вызова fflush на него, после printf:

#include <stdio.h> 

int main() { 
    int i; 
    for(i=0; i<5; i++) { 
     printf("hello"); 
     fflush(stdout); 
     sleep(1); 
    }  
} 
1

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

0

Попробуйте это:

int i; 
for(i=0;i<5;i++){ 
printf("hello\n"); 
i=0; 
sleep(1); 
} 
+1

Просьба представить комментарий, объясняющий, почему это решит проблему. –

+0

i = 0; блокировать запись «Привет» 5 раз. –

+0

Это не будет иметь предполагаемого эффекта. Это заставляет цикл работать вечно (и при этом печатать «Hello»). ОП все еще хочет, чтобы он печатал «Привет» пять раз, но имел задержку между ними. –

Смежные вопросы