В C Вы получаете неявное преобразование от void*
до любого другого (данные) указатель.
попробуйте использовать \ r
вместо \ n
при печати новой «версии».
for(int i=0;i<=100;++i) printf("\r[%3d%%]",i);
printf("\n");
Я бы сказал, что для таких вещей можно использовать такую библиотеку, как ncurses. curses помогает перемещать курсор по экрану, рисовать текст и тому подобное.
Примерно так:
std::stringstream out;
for (int i = 0; i< 10; i++)
{
out << "X";
cout << "\r" << "[" << out.str() << "]";
}
Скрытый бит - это символ возврата каретки "\ r", который заставляет курсор перемещаться в начало строки без перехода до следующей строки.
'\ r' выполнит возврат каретки. Представьте, что принтер выполняет возврат каретки без перевода строки ('\ n'). Это вернет точку записи обратно в начало строки ... затем повторно напечатает ваш обновленный статус поверх исходной строки.
Другой вариант - просто печатать по одному символу за раз. Обычно stdout буферизируется по строке, поэтому вам нужно вызвать fflush (stdout) -
for(int i = 0; i < 50; ++i) {
putchar('X'); fflush(stdout);
/* do some stuff here */
}
putchar('\n');
Но здесь нет красивого завершающего символа «]», указывающего на завершение.
Это другой язык, но этот вопрос может вам помочь. По сути, escape-символ \ r (возврат каретки, в отличие от \ n новой строки) перемещает вас обратно в начало вашей текущей напечатанной строки, чтобы вы могли перезаписать то, что вы уже напечатали.