2010-06-04 4 views
3

Ok, это просто из любопытства, но почему функция сна не работает в цикле, или как я могу получить его на работу в цикле?C++, сон, и петли

for(int i = 0; i < 5; i++) { 
    cout << i << endl; 
    sleep(2); 
} 
+1

Ummm ... что заставляет вас думать, что он не работает? –

+0

возможно, его «сохранение» этих снов, и, приведенный выше пример, распечатает 0 1 2 3 4 через 10 секунд? ЕСЛИ это так, как мне этого избежать? –

+0

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

ответ

6

cout в буфер, то есть его содержание не всегда выводится на консоль сразу. Попробуйте добавить cout.flush() прямо сейчас sleep(2);

+0

ahhh, interesting. –

+26

<< endl фактически очищает поток. Он имеет тот же эффект, что и << << \ n "<< flush. –

+0

Или вы можете использовать std :: ends, чтобы сделать то же самое без новой строки. – Konrad

2

Если это не работает для вас, вы можете попробовать этот код:

#include <iostream> 
#include <windows.h> 

... 

for(int i = 0; i < 5; i++) { 
    cout << i << endl; 
    Sleep(2000); 
} 
+6

С учетом тега linux на вопрос, я бы предположил, что включение не является опцией – BenG

0

По моему скромному мнению, эта программа должна работать правильно. Может быть, ваш std :: cout перенаправляется где-то еще? Вы не вызываете правильную функцию sleep() (но без заголовка)? Или другая проблема? Но это должно сработать.

0

Вы пробовали разворачивая цикл, чтобы увидеть, если это ведет себя точно так же?

cout << 1 << endl; 
sleep(2); 
cout << 2 << endl; 
sleep(2); 
// Etc. 

Предполагая, что ведет себя точно так же, несмотря на то, станд :: епсИ должен очистить буфер, он действительно похож dave.kilian имеет правильную идею, что соиЬ не не получает покраснел до программы (предположительно) заканчивается.

В этом случае, попытайтесь делать зЬй :: вровень и посмотреть, если это помогает - это возможно у вас есть ошибка (пропущенная функция?) В вашей стандартной библиотеке.

Другое дело, чтобы попытаться это перенаправить вывод в файл во время его просмотра с tail -f в другом окне. Посмотрите, происходит ли такая же задержка при перенаправлении.

Наконец попробовать играть с уровнем оптимизации компилятора и посмотреть, если это изменяет результаты.

0

Дэйв уже дал вам ответ, поэтому я не буду касаться этого. Однако, если он используется исключительно для отладки или кода прототипа, вы также можете передать вывод в sdling std :: cout, std :: cerr, который небуферизирован для начала. Это означает, что вам не нужно явно вызывать flush, и вам не нужно добавлять endl к вашему выводу.