Использование цикла for для выполнения загрузки… Анимация

#c #loops #for-loop

#c #циклы #for-цикл

Вопрос:

итак, я создаю калькулятор BMI на C, но пытаюсь сделать его более увлекательным и добавить немного дополнительных символов, сделав его более похожим на программу. Одна из функций, которую я пытался реализовать, — создать анимацию, которая говорит что-то вроде загрузки… где «…» появляется по одной секунде за раз, чтобы имитировать то, что на самом деле загружается. Я придумал что-то вроде этого:

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

Однако это вообще не работает, поскольку все, что он выводит, загружается, затем «…» и все, что появляется дальше в программе.
Я смог заставить это работать, если внутри printf в цикле я помещаю n как в

 printf("Loading");
for (int i = 0; i < 5 ; i  )
{   
    printf(".n");
    sleep(1);
}
  

Любые предложения относительно того, почему это может произойти, будут очень признательны. Спасибо

Комментарии:

1. это потому stdout , что буферизуется. n также сигнализирует о сбросе буфера. Вам нужно очищать буфер после каждой итерации. Попробуйте fflush(NULL) или fflush(stdout)

2. @Raildex n не обязательно сигнализирует об очистке буфера, но обычно терминал очищает буфер при переводе строки. Поправьте меня, если я ошибаюсь.

Ответ №1:

Вы можете использовать b пробел. Возможно, вам также придется убедиться, что консоль сбрасывается после каждой печати, потому что обычно это происходит только при n обнаружении.

Вот ужасный симулятор экрана загрузки для Windows:

(Только Sleep для Windows, остальное стандартное C.)

 #include <stdio.h>
#include <windows.h>

int main (void)
{
  printf("Loading"); fflush(stdout);
  
  for(;;)
  {
    for(int i=0; i<3; i  )
    {
      printf("."); fflush(stdout); 
      Sleep(300);
    }
    for(int i=0; i<3; i  )
    {
      printf("b b"); fflush(stdout);
      Sleep(300);
    }
  }

  return 0;
}
  

b b возвращает один символ назад, печатает пробел, который снова перемещается на 1 позицию вперед, что подтверждается вторым b счетчиком.

Ответ №2:

Попробуйте что-то подобное:

 printf("Loading");
fflush(stdout);

for (int i = 0; i < 5; i  ) {
    putchar('.');
    fflush(stdout);
    sleep(1);
}
putchar('n');
  

sleep() является частью unistd.h библиотеки Unix.