Pregunta

Hola chicos, he visto que las aplicaciones de la consola imprimen en colores y las aplicaciones que he visto, como ffmpeg, imprimen texto sobre sí mismo en lugar de una nueva línea. ¿Cómo imprimo sobre una línea existente? Quiero mostrar fps en la aplicación de mi consola en la parte superior o inferior y hacer que los printfs regulares vayan allí y se desplacen normalmente

-editar- Necesito esto para Windows pero está destinado a ser multiplataforma, por lo que eventualmente tendré una implementación de Linux y Mac

¿Fue útil?

Solución

Hay dos posibilidades simples que funcionan en Linux y en Windows, pero solo para una línea:

  • printf (" \ b "); regresará para un carácter, así que puedes contar cuántos caracteres quieres retroceder y disparar en un bucle, o sabes que solo escribes n números y hazlo como
    printf("\b\b\b\b\b\b\b\b\b\b");
  • printf (" texto que se sobrescribirá con next printf \ r "); esto devolverá el cursor al principio de la línea, por lo que cualquier printf siguiente lo sobrescribirá. Asegúrese de escribir una cadena de la misma longitud o más larga para que la sobrescriba por completo.

Si desea volver a escribir varias líneas, no hay nada tan portátil como ncurses , hay Libéralos en prácticamente todos los sistemas operativos, y no tienes que ocuparte de las diferencias ANSI.

editar: se agregó un enlace a la página de wikipedia de ncurses, brinda una gran descripción general, así como una lista de enlaces y tal vez una traducción a su idioma preferido

Otros consejos

Echa un vistazo a ncurses. Tiene enlaces para la mayoría de los lenguajes de scripting.

Puedes usar '\ r' en lugar de '\ n' .

El número de caracteres ASCII 8 (A.K.A. Ctrl-H, BS o Retroceso) le permite realizar una copia de seguridad de un carácter. El número de carácter ASCII 13 (A.K.A Ctrl-M, CR o retorno de carro) devuelve el cursor al principio de la línea.

Si está trabajando en C, intente con putchar (8); y putchar(13);

La magia de los colores, la ubicación del cursor, el bliking, etc. están dentro de códigos de escape ANSI . Cualquier consola de texto capaz de manejar códigos ANSI puede usarlos simplemente imprimiéndolos en la consola (es decir, por medio de echo en un script de bash o en la función printf () en C).

Los terminales Unix son compatibles con las secuencias de escape ANSI y el mundo de Windows solía admitirlos en los viejos tiempos de MS-DOS, pero el soporte de la consola multibyte puso fin a esto. Hay más información aquí . Sin embargo, hay otras formas de salir de la impresión de secuencias ANSI disponible en Windows . Además, si tiene Cygwin instalado en su Windows, los códigos ANSI funcionan tan bien como en cualquier terminal Unix.

Muchas personas mencionan la biblioteca Ncurses, que es el estándar de facto para cualquier aplicación basada en texto similar a gui. Lo que hace esta biblioteca es ocultar todas las diferencias de terminal (versiones de Windows / Unix) para representar la misma información de la forma más idéntica posible en todas las plataformas, aunque, según mi propia experiencia, le digo que esto no siempre es cierto (es decir, marcos de ventanas de texto típicos cambiar porque los caracteres especiales no están disponibles en todas las codificaciones de caracteres). La contrapartida del uso de ncurses es que es una API completa y es mucho más difícil comenzar con ella que simplemente escribir algunas secuencias de escape ANSI para cosas simples como cambiar el color de fuente, limpiar la pantalla o mover el cursor hacia atrás al azar posición.

En aras de la integridad, pego un ejemplo de uso de la secuencia ANSI en Linux que cambia el indicador a azul y muestra la fecha:

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "

Puede usar Ncurses -

  El paquete

ncurses es una biblioteca de subrutinas para la pintura de pantalla independiente del terminal y el manejo de eventos de entrada que presenta un modelo de pantalla de alto nivel al programador, que oculta las diferencias entre los tipos de terminales y realiza la optimización automática de la salida cambiar una pantalla llena de texto en otra

Dependiendo de la plataforma en la que se esté desarrollando, probablemente haya una API más poderosa que podría usar, en lugar de los antiguos códigos de control ASCII.

por ejemplo Si está trabajando en Win32, puede manipular directamente el búfer de pantalla de la consola.

Un buen lugar para comenzar podría estar aquí. http://msdn.microsoft.com/en-us /library/ms683171(VS.85).aspx

He estado buscando funciones / API similares que me permitirían acceder a la consola como algo más que un flujo de texto para otras plataformas. No he encontrado nada todavía, pero, de nuevo, no he estado buscando tan bien.

Espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top