algunas sutilezas que valgan la pena ...
\33[2K
borra toda la línea el cursor se encuentra actualmente en
\033[A
mueve el cursor una línea hacia arriba, pero en la misma columna es decir, no al comienzo de la línea de
\r
lleva el cursor al principio de la línea (r está para rebobinar), pero no borrar nada
En xterm específicamente, probé las respuestas mencionadas anteriormente y la única forma que encontré para borrar la línea y comenzar de nuevo al principio es la secuencia (del comentario anterior publicado por @ Stephan202 y @vlp y @mantal) \33[2K\r
en una nota de aplicación, para conseguir que funcione correctamente, por ejemplo, en un escenario de cuenta atrás ya que no estaba usando un carácter de nueva línea '\n'
al final de cada fprintf()
, así que tuve que fflush()
la corriente cada vez (para darle un poco de contexto, comencé xterm usando un tenedor en una máquina Linux sin redireccionar stdout, solo estaba escribiendo en el puntero de archivo FILE fdfile
con un descriptor de archivo no bloqueante que tenía n la dirección de la pseudo terminal que en mi caso era /dev/pts/21
):
fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);
Nota que he utilizado tanto el \ 33 [2K secuencia para borrar la línea seguida por la secuencia de \r
de rebobinado para volver a colocar el cursor en el comienzo de la línea. Tuve que fflush()
después de cada fprintf()
porque no tengo un nuevo carácter de línea al final '\n'
. El mismo resultado sin necesidad de fflush() requeriría la secuencia adicional para subir una línea:
fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);
Tenga en cuenta que si tiene algo en la línea inmediatamente por encima de la línea que desea escribir, se obtendrá exceso escrito con el primer fprintf(). Usted tendría que salir de una línea adicional superior para permitir el primer movimiento hacia arriba una línea:
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 librería ncurses probablemente lo hará.No lo conozco lo suficiente como para proporcionar una respuesta, pero aquí hay enlaces a [documentos] (http://linux.die.net/man/3/clrtoeol) y [una pregunta relacionada] (http: // stackoverflow .com/questions/5072881). Este comentario se basa en la respuesta de Wil Shipley de 2009, que puede eliminarse. –