Как правильно реализовать функцию сна в моем цикле for? (Ubuntu) - PullRequest
2 голосов
/ 16 апреля 2019

Я пытаюсь заставить мой код что-то напечатать на экране, затем подождать 1 секунду, затем обойти цикл for и снова напечатать его 21 раз. Это работает, когда я делаю это в Windows в CodeBlocks, используя #include и затем Sleep (1000). Но когда я делаю это на моей виртуальной машине Ubuntu с помощью #include и sleep (1), все исчезает из моего терминала на 21 секунду, а затем все появляется сразу. Я думаю, что я использую неправильную функцию или что-то.

Есть идеи?

Это код в терминале Ubuntu, который в итоге удаляет все, что уже есть на моем терминале, ждет 21 секунду, затем просто печатает «Hello» 21 раз.

#include <stdio.h>
#include <unistd.h>

int main()

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

}

Это код в Windows, который печатает «Hello» каждую секунду в течение 21 секунды, поэтому выводит 21 Hello на моем экране в течение 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; 
    }

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

printf вывод буферизуется - это означает, что он не гарантированно появится на экране немедленно. Скорее, оно появляется, когда происходит одно из следующих действий:

  • когда буфер заполнен, - в это время старое содержимое буфера отображается на экране, и буфер очищается заново для нового вывода - это называется очистка буфера
  • когда приложение завершается - что вызывает сброс всех буферов printf, и это то, что вы видите на экране
  • Когда буфер очищается программистом.

Последний случай наиболее интересен для вас, и вы можете сделать это двумя способами - либо включить в свою строку управляющий символ \n (новая строка), например

 printf("Hello\n");

или вызов fflush для потока stdout, например

 printf("Hello");
 fflush(stdout);
1 голос
/ 16 апреля 2019

В UNIX потоки процесса буферизируются - они накапливают ввод-вывод и не «сбрасываются» на базовое устройство сразу при записи по умолчанию. Итак - вам нужно очистить поток:

#include <stdio.h>
#include <unistd.h>

int main()

{
    for (int i = 0; i < 21; i++)
    {
        printf("Hello");
        fflush(stdout);
        sleep(1);           
    }

}

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

...