#c #loops #for-loop #sleep
#c #циклы #for-цикл #сон
Вопрос:
Я пытаюсь заставить свой код печатать что-то на экране, затем подождать 1 секунду, затем обойти цикл for и распечатать его снова 21 раз. Это работает, когда я делаю это в Windows в CodeBlocks с помощью #include, а затем Sleep(1000). Но когда я делаю это на своей виртуальной машине Ubuntu с помощью #include и sleep(1), все исчезает с моего терминала на 21 секунду, а затем все появляется сразу. Мне кажется, я использую не ту функцию или что-то в этом роде.
Есть идеи?
Это код в терминале Ubuntu, который в конечном итоге удаляет все, что уже есть на моем терминале, ждет 21 секунду, а затем просто печатает «Привет» 21 раз.
#include <stdio.h>
#include <unistd.h>
int main()
{
for (int i = 0; i < 21; i )
{
printf("Hello");
sleep(1);
}
}
Это код в Windows, который печатает «Привет» каждую секунду в течение 21 секунды, поэтому печатает 21 привет на моем экране в течение 21 секунды. Именно этого я и пытаюсь добиться в своей виртуальной машине Ubuntu.
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
for (int i = 0; i < 21; i )
{
printf("Hello");
Sleep(1000);
}
return 0;
}
Комментарии:
1. Заменить
printf
наputs
.2. Голосование за закрытие: ОП признает, что предоставленный ими MCVE отличается от реальной проблемы, которую они решают, предложите новый вопрос. Процитировать ОП:
I tried adding the fflush(stdout); like you suggested, but it doesn't work for my code - probably because I'm using mvprintw (from ncurses) instead of printf
Ответ №1:
В UNIX потоки обработки буферизуются — они накапливают ввод-вывод и не «сбрасываются» на базовое устройство сразу при записи, по умолчанию. Итак, вам нужно очистить поток:
#include <stdio.h>
#include <unistd.h>
int main()
{
for (int i = 0; i < 21; i )
{
printf("Hello");
fflush(stdout);
sleep(1);
}
}
Я полагаю, это также сработало бы, если бы вы вывели новую строку ‘n’ после «Hello».
Ответ №2:
printf
вывод буферизуется, что означает, что он не гарантированно появится на экране немедленно. Скорее, оно появляется, когда происходит одно из следующих событий:
- когда буфер заполняется, — в это время старое содержимое буфера отображается на экране, а буфер очищается заново для нового вывода — это называется очисткой буфера
- когда приложение завершается, что приводит к очистке всех
printf
буферов, и это то, что вы видите на экране - Когда программист сбрасывает буфер.
Последний случай наиболее интересен для вас, и есть два способа, которыми вы можете это сделать — либо включить n
(новую строку) управляющий символ в вашу строку, например
printf("Hellon");
или вызвать fflush
поток стандартного вывода, например
printf("Hello");
fflush(stdout);
Комментарии:
1. Есть ли способ использовать другую функцию для достижения того же результата? Я попытался добавить
fflush(stdout);
то, что вы предложили, но это не работает для моего кода — вероятно, потому, что я используюmvprintw
(из ncurses) вместоprintf
. Я думал, что смогу применить то же самое решение, но, видимо, нет. Есть ли что-то еще, что я могу использовать вместо sleep?2. @Sawy3r это было бы огромной помощью для вас и людей, отвечающих на ваш вопрос, если ваш MCVE на самом деле MCVE. Теперь у вас есть два ответа, которые приняли ваш вопрос за чистую монету. Я предлагаю вам задать другой вопрос с надлежащим MCVE.