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