Как мне правильно реализовать функцию sleep в моем цикле for? (Убунту)

#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.