alcune sottigliezze vale la pena ...
\33[2K
cancella l'intera linea il cursore è attualmente in
\033[A
sposta il cursore su una riga, ma nel stessa colonna cioè non l'inizio del linea
\r
porta il cursore all'inizio della riga (r è per il riavvolgimento), ma non cancellazione di
In xterm in particolare, ho provato le risposte di cui sopra e l'unico modo in cui ho trovato per cancellare la riga e ricominciare all'inizio è la sequenza (dal commento sopra postato da @ Stephan202 come pure @vlp e @mantal) \33[2K\r
su una nota implementazione, per farlo funzionare correttamente, ad esempio in uno scenario di conto alla rovescia dal momento che non stavo usando un carattere di nuova riga '\n'
alla fine di ogni fprintf()
, così ho dovuto fflush()
il flusso di volta in volta (per darti un po 'di contesto, ho avviato xterm usando un fork su una macchina Linux senza reindirizzare lo stdout, stavo semplicemente scrivendo sul puntatore FILE bufferizzato fdfile
con un descrittore di file non bloccante che avevo seduto o n l'indirizzo pseudo terminale che nel mio caso era /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Notare che ho usato sia la [2K sequenza \ 33 per cancellare la linea seguita dalla sequenza \r
riavvolgimento per riposizionare il cursore all'inizio della linea. Ho dovuto fflush()
dopo ogni fprintf()
perché non ho un carattere di nuova riga alla fine '\n'
. Lo stesso risultato senza bisogno fflush() richiederebbe la sequenza aggiuntiva a salire una linea:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Si noti che se si ha qualcosa sulla riga immediatamente sopra la linea che si desidera scrivere su, otterrà sovra- scritto con il primo fprintf(). Si dovrebbe lasciare una linea supplementare di cui sopra per consentire il primo movimento 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);
}
La libreria ncurses probabilmente fare questo.Non lo conosco abbastanza bene da fornire una risposta, ma qui ci sono i collegamenti a [docs] (http://linux.die.net/man/3/clrtoeol) e [una domanda correlata] (http: // stackoverflow .com/domande/5.072.881). Questo commento è basato sulla risposta di Wil Shipley del 2009, che potrebbe essere cancellata. –