Некоторые стоящие тонкости ...
\33[2K
стирает всю строку, на которой находится ваш курсор
\033[A
перемещает курсор вверх на одну строку, но в том же столбце , т.е. не до начала строки
\r
переводит курсор в начало строки (r для перемотки назад), но не ничего не стирает
В частности, в xterm я попробовал ответы, упомянутые выше, и единственный найденный способ стереть строку и начать заново в начале - это последовательность (из приведенного выше комментария @ Stephan202, а также @vlp и @mantal) \33[2K\r
В примечании к реализации, чтобы заставить его работать должным образом, например, в сценарии обратного отсчета, поскольку я не использовал символ новой строки '\n'
в конце каждого fprintf()
, поэтому мне приходилось каждый раз fflush()
поток (чтобы дать вам некоторый контекст, я запустил xterm, используя форк на машине с Linux без перенаправления stdout, я просто записывал в буферизованный указатель FILE fdfile
с неблокирующим файловым дескриптором, который я сидел по адресу псевдотерминала, который в моем случае был /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Обратите внимание, что я использовал последовательность \ 33 [2K, чтобы стереть строку, за которой следует последовательность перемотки \r
, чтобы переместить курсор в начало строки. Мне нужно было fflush()
после каждого fprintf()
, потому что у меня нет символа новой строки в конце '\n'
. Тот же результат без использования fflush () потребует дополнительной последовательности для перехода вверх по строке:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Обратите внимание, что если у вас есть что-то в строке сразу над строкой, в которую вы хотите записать, это будет перезаписано с первой функцией fprintf (). Вы должны были бы оставить дополнительную строку выше, чтобы учесть первое движение вверх на одну строку:
i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
i--;
sleep(1);
}