Borrado de salida de un progtwig de terminal Linux C / C ++

Estoy interesado en borrar el resultado de un progtwig C producido con instrucciones printf, múltiples líneas de largo.

Mi conjetura inicial fue usar

printf("output1\n"); printf("output2\n"); rewind(stdout); printf("output3\n"); printf("output4\n"); 

pero esto produce

  output1 output2 output3 output4 

Esperaba que produjera

  output3 output4 

¿Alguien sabe cómo obtener el último resultado?

Puede tener el resultado deseado tanto para el terminal como para las tuberías si recuerda eliminar los caracteres de control también. Esto está codificado para dos líneas.

 #include  int main () { fputs("output1\n",stdout); fputs("output2\n",stdout); fputs("\033[A\033[2K\033[A\033[2K",stdout); rewind(stdout); ftruncate(1,0); /* you probably want this as well */ fputs("output3\n",stdout); fputs("output4\n",stdout); return 0; } 

La mayoría de los terminales admiten códigos de escape ANSI . Puede usar una J (con el parámetro 2) para borrar la pantalla y una H (con los parámetros 1,1) para restablecer el cursor a la esquina superior izquierda:

 printf("\033[2J\033[1;1H"); 

Alternativamente, una solución más portátil sería usar una biblioteca como ncurses , que abstrae los detalles específicos de la terminal.

Una vez que imprime algo en el terminal, no puede quitarlo fácilmente. Puede borrar la pantalla, pero exactamente cómo hacerlo depende del tipo de terminal, y borrar la pantalla eliminará todo el texto en la pantalla, no solo lo que imprimió.

Si realmente quieres un control fino sobre el resultado de la pantalla usa una biblioteca como ncurses .

En lo que respecta a C, stdout no es más que un flujo de bytes. Ese flujo se puede conectar a un CRT (o pantalla plana), o se puede conectar a un dispositivo de copia impresa como un teletipo o incluso una impresora de hojas. Llamar a rebobinar en la transmisión no se reflejará necesariamente en el dispositivo de salida, ya que puede no tener ningún sentido en el contexto de ese dispositivo; piense en lo que significaría el rebobinado en una terminal de copia impresa o en una impresora alimentada con hojas.

C no ofrece ningún soporte integrado para la gestión de visualización, por lo que deberá utilizar una biblioteca de terceros como ncurses.

También puedes probar algo como esto, que borra toda la pantalla:

 printf("\033[2J\033[1;1H"); 

Puede incluir \033[1;1H para asegurarse de que \033[2J no mueva el cursor en la esquina superior izquierda.

Más específicamente:

  • 033 es el octal de ESC
  • 2J es para borrar toda la pantalla de la consola / terminal (y mueve el cursor a la esquina superior izquierda en DOS ANSI.SYS)
  • 1;1H mueve el cursor a la fila 1 y columna 1

Una forma es hacer un ejecutivo (‘clear’).

De hecho, cuando captura / redirige su stdout (./program> output.file), no hay forma de cómo eliminar el contenido de ese archivo, incluso printf (“\ 033 [2J \ 033 [1; 1H”); simplemente agrega esta secuencia de caracteres en ella.