meaning c terminal console stdout

c - stdout meaning



Cómo sobrescribir stdout en C (8)

En la mayoría de las conchas modernas, puede presionar las flechas hacia arriba y hacia abajo y, cuando se le solicite, colocará los comandos anteriores que haya ejecutado. Mi pregunta es, ¿cómo funciona esto?

Me parece que el shell está de alguna manera manipulando stdout para sobrescribir lo que ya ha escrito.

Noté que programas como wget hacen esto también. ¿Alguien tiene alguna idea de cómo lo hacen?


Además de / r y / b, eche un vistazo a ncurses para un control avanzado sobre lo que está en la pantalla de la consola. (Incluyendo columnas, moviéndose arbitrariamente, etc.).


El programa hace esto imprimiendo caracteres especiales que la terminal interpreta de una manera especial. La versión más simple de esto es (en la mayoría de los terminales linux / unix) para imprimir ''/ r'' (retorno de carro) a la salida normal que restablece la posición del cursor al primer carácter en la línea actual. Entonces, lo que escriba a continuación sobrescribirá la línea que escribió anteriormente. Esto se puede usar para indicadores de progreso simples, por ejemplo.

int i = 0; while (something) { i++; printf("/rprocessing line %i...", i); ... }

Pero hay secuencias de caracteres de escape más complicadas que se interpretan de varias maneras. Se pueden hacer todo tipo de cosas con esto, como colocar el cursor en una posición específica en la pantalla o configurar el color del texto. Si o cómo se interpretan estas secuencias de caracteres depende de su terminal, pero una clase común soportada por la mayoría de las terminales son las secuencias de escape ansi . Entonces, si quieres texto en rojo, prueba:

printf("Text in /033[1;31mred/033[0m/n");


Está hecho con la biblioteca readline ... No estoy seguro de cómo funciona detrás de las escenas, pero no creo que tenga nada que ver con stdout o streams. Sospecho que readline utiliza algún tipo de comandos de terminal crípticos (para mí, al menos), es decir, coopera con el programa de terminal que realmente muestra su sesión de shell. No sé si puede obtener un comportamiento de línea de lectura simplemente imprimiendo el resultado.

(Piense en esto: stdout se puede redirigir a un archivo, pero el truco de las teclas de flecha arriba / abajo no funciona en los archivos).


La forma más simple es imprimir para excluir el carácter de retorno de carro (''/ r'').

El cursor se moverá al comienzo de la línea, lo que le permite sobrescribir sus contenidos.


No está manipulando stdout - está sobrescribiendo los caracteres que ya han sido mostrados por el terminal.

Prueba esto:

#include <stdio.h> #include <unistd.h> static char bar[] = "=======================================" "======================================>"; int main() { int i; for (i = 77; i >= 0; i--) { printf("[%s]/r", &bar[i]); fflush(stdout); sleep(1); } printf("/n"); return 0; }

Eso está muy cerca de la producción de wget , ¿verdad? /r es un retorno de carro, que el terminal interpreta como "mover el cursor de vuelta al inicio de la línea actual".

Su caparazón, si es bash , utiliza la biblioteca GNU Readline , que proporciona una funcionalidad mucho más general, que incluye la detección de tipos de terminales, administración de historial, enlaces de teclas programables, etc.

Una cosa más: en caso de duda, la fuente de su wget, su caparazón, etc. están disponibles.


Puede usar el retorno de carro para simular esto.

#include <stdio.h> int main(int argc, char* argv[]) { while(1) { printf("***********"); fflush(stdout); sleep(1); printf("/r"); printf("..........."); sleep(1); } return 0; }


Un programa que se ejecuta en un terminal de texto / consola puede manipular el texto que se muestra en su consola de varias maneras (hacer texto en negrita, mover el cursor, borrar la pantalla, etc.). Esto se logra imprimiendo secuencias de caracteres especiales, llamadas "secuencias de escape" (porque generalmente comienzan con Escape, ASCII 27).

Si stdout va a un terminal que comprende estas secuencias de escape, la visualización del terminal cambiará en consecuencia.

Si redirige el stdout a un archivo, las secuencias de escape aparecerán en el archivo (que generalmente no es lo que desea).

No existe un estándar completo para las secuencias de escape, pero la mayoría de los terminales usan las secuencias introducidas por VT100 , con muchas extensiones. Esto es lo que entienden la mayoría de los terminales en Unix / Linux (xterm, rxvt, konsole) y otros como PuTTY.

En la práctica, no codificaría directamente las secuencias de escape en su software (aunque podría hacerlo), sino que usaría una biblioteca para imprimirlas, como ncurses o GNU readline mencionadas anteriormente. Esto permite la compatibilidad con diferentes tipos de terminales.


Para sobrescribir la línea de salida estándar actual (o partes de ella) use /r (o /b .) El carácter especial /r (retorno de carro) devolverá la referencia al principio de la línea, lo que le permitirá sobrescribirla. El carácter especial /b devolverá el cursor solo en una posición, lo que le permitirá sobrescribir el último carácter, por ej.

#include <stdio.h> #include <unistd.h> int i; const char progress[] = "|/-//"; for (i = 0; i < 100; i += 10) { printf("Processing: %3d%%/r",i); /* /r returns the caret to the line start */ fflush(stdout); sleep(1); } printf("/n"); /* goes to the next line */ fflush(stdout); printf("Processing: "); for (i = 0; i < 100; i += 10) { printf("%c/b", progress[(i/10)%sizeof(progress)]); /* /b goes one back */ fflush(stdout); sleep(1); } printf("/n"); /* goes to the next line */ fflush(stdout);

Use fflush(stdout); porque la salida estándar generalmente está almacenada en un búfer y la información no puede imprimirse inmediatamente en la salida o terminal