Alcune utili sottigliezze...
\33[2K
cancella l'intera riga su cui si trova attualmente il cursore
\033[A
sposta il cursore in alto di una riga, ma nella stessa colonna cioè non all'inizio della riga
\r
porta il cursore all'inizio della riga (r sta per ritorno a capo N.B. i ritorni a capo non includono una nuova riga quindi il cursore rimane sulla stessa riga) ma non cancella qualsiasi cosa
In xterm in particolare, ho provato le risposte sopra menzionate e l'unico modo che ho trovato per cancellare la riga e ricominciare dall'inizio è la sequenza (dal commento sopra pubblicato da @Stephan202 così come @vlp e @mantal) \33[2K\r
In una nota di implementazione, per farlo funzionare correttamente, ad esempio in uno scenario di conto alla rovescia poiché non stavo usando un carattere di nuova riga '\n'
alla fine di ogni fprintf()
, quindi ho dovuto fflush()
lo stream ogni volta (per darti un po' di contesto, ho avviato xterm usando un fork su una macchina Linux senza reindirizzare stdout, stavo solo scrivendo al puntatore FILE bufferizzato fdfile
con un descrittore di file non bloccante avevo seduto sullo pseudo indirizzo del terminale che nel mio caso era /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Nota che ho usato entrambe le sequenze \33[2K per cancellare la riga seguita dal \r
sequenza di ritorno a capo per riposizionare il cursore all'inizio della riga. Ho dovuto fflush()
dopo ogni fprintf()
perché non ho un carattere di nuova riga alla fine '\n'
. Lo stesso risultato senza bisogno di fflush() richiederebbe che la sequenza aggiuntiva salisse di una riga:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Nota che se hai qualcosa sulla riga immediatamente sopra la riga su cui vuoi scrivere, verrà sovrascritto con il primo fprintf(). Dovresti lasciare una riga in più sopra per consentire il primo movimento verso l'alto di una riga:
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);
}
È possibile utilizzare i codici di escape VT100. La maggior parte dei terminali, incluso xterm, sono a conoscenza di VT100. Per cancellare una riga, questo è ^[[2K
. In C questo dà:
printf("\33[2K\r");
Puoi usare un \r
(ritorno a capo) per riportare il cursore all'inizio della riga:
printf("hello");
printf("\rbye");
Verrà stampato ciao sulla stessa linea. Tuttavia, non cancellerà i caratteri esistenti e perché ciao è più corto di ciao , ti ritroverai con ciao . Per cancellarlo puoi rendere la tua nuova stampa più lunga per sovrascrivere i caratteri extra:
printf("hello");
printf("\rbye ");
Oppure, prima cancellalo con pochi spazi, poi stampa la tua nuova stringa:
printf("hello");
printf("\r ");
printf("\rbye");
Stamperà ciao , quindi vai all'inizio della riga e sovrascrivila con degli spazi, quindi torna di nuovo all'inizio e stampa ciao .