¿Obtener el tamaño del terminal en c para Windows?

4 minutos de lectura

avatar de usuario
DrBeco

¿Cómo verificar ymax y xmax en una ventana de consola, en Windows, usando c simple?

Existe este fragmento de código para Linux:

#include <stdio.h>
#include <sys/ioctl.h>
int main (void)
{
    struct winsize max;
    ioctl(0, TIOCGWINSZ , &max);
    printf ("lines %d\n", max.ws_row);
    printf ("columns %d\n", max.ws_col);
}

Ahora me pregunto cómo puedo hacer lo mismo para Windows. Lo intenté winioctl.h pero no define struct winsize ni ningún otro con un nombre similar.

¿Algun consejo? Gracias.

PD. En Linux también puedes encontrar el tamaño de la consola usando getenv("LINES");. ¿Hay una variable similar en Windows?

PPS. Además, siempre hay ncurses.hque supongo que funciona en ambos sistemas, pero lo estoy evitando debido a conflictos con otras bibliotecas que tengo.

PPP. Esta pregunta aquí ¿Obtener el ancho del terminal en C? tiene un montón de consejos, así que no hay necesidad de repetir eso.

avatar de usuario
cuántico

Esto imprime el tamaño de la consola, no el búfer:

#include <windows.h>

int main(int argc, char *argv[]) {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    int columns, rows;

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;

    printf("columns: %d\n", columns);
    printf("rows: %d\n", rows);
    return 0;
}

Este código funciona porque srWindow “contiene las coordenadas del búfer de la pantalla de la consola de las esquinas superior izquierda e inferior derecha de la ventana de visualización”, y el SMALL_RECT estructura “especifique las filas y columnas de las celdas de caracteres del búfer de pantalla” según MSDN. Resté los lados paralelos para obtener el tamaño de la ventana de la consola. desde que tengo 1 menos que el valor real, agregué uno.

  • Tengo poco tiempo para probarlo, pero parece que esta es la respuesta correcta a la pregunta. ¿Le importaría señalar la diferencia entre esta respuesta y la actualmente aceptada que muestra el tamaño del búfer? ¡Gracias!

    – DrBeco

    30 de septiembre de 2012 a las 20:07

  • @DrBeco En la mayoría de los casos, el tamaño del búfer de su respuesta y la ventana de visualización mencionada en esta respuesta tienen el mismo ancho, aunque esto no es obligatorio. Sin embargo, como observa, el búfer y las ventanas pueden tener, y a menudo tienen, diferentes alturas; esto es lo que proporciona la capacidad de desplazarse hacia atrás en una sesión de consola de Windows. Me resulta más fácil pensar en términos de un búfer grande, con una ventana de visualización más pequeña que puede ver cualquier sección del búfer principal.

    – dnuff

    18/03/2016 a las 21:42

  • Exactamente lo que estaba buscando. +1

    – Xam

    30 de marzo de 2018 a las 23:18

  • O podría usar CONSOLE_SCREEN_BUFFER_INFO.dwSize.X y .Y para abreviar.

    – RhetoricalRuvim

    1 ago. 2019 a las 18:31

  • Si STDOUT se redirige a un archivo, entonces el GetConsoleScreenBufferInfo() devolución de llamadas FALSEpor lo que debe ser probado.

    –Craig McQueen

    29 de septiembre de 2020 a las 5:26


(Respuesta parcial)

Este código:

CONSOLE_SCREEN_BUFFER_INFO csbi;
int ret;
ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ),&csbi);
if(ret)
{
    printf("Console Buffer Width: %d\n", csbi.dwSize.X);
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y);
}

Da el tamaño del búfer. El único problema es que dwSize.Y no es realmente el tamaño de la pantalla (300 aquí en lugar de 25 líneas). Pero dwSize.X coincide con el número de la columna. solo necesidades windows.h trabajar.

avatar de usuario
León van Dommelen

Las siguientes dos funciones obtendrán el tamaño de la ventana algo más directamente.

Tenga en cuenta que encontré, usando gcc, que ni este enfoque ni GetConsoleScreenBufferInfo funcionan si el programa está canalizado. Eso es algo molesto en cuanto a / f, entonces tampoco funciona. Aparentemente, los datos de la pantalla no están disponibles en una tubería.

Um, el comentario anterior es, por supuesto, enormemente estúpido. 😉 ¡Es STDOUT que no es la pantalla en una tubería! Eso significa que prefiero usar STD_ERROR_HANDLE antes que STD_OUTPUT_HANDLE. Es mucho menos probable que dirija el error estándar lejos de la pantalla que la salida estándar.

typedef struct _CONSOLE_FONT_INFO {
  DWORD nFont;
  COORD dwFontSize;
} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO;

BOOL WINAPI GetCurrentConsoleFont(
   HANDLE             hConsoleOutput,
   BOOL               bMaximumWindow,
   PCONSOLE_FONT_INFO lpConsoleCurrentFont
);

/* Get the window width */
int getww_(void)
{
    CONSOLE_FONT_INFO info;
    GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info);
    return info.dwFontSize.X;
}

/* Get the window height */
int getwh_(void)
{
    CONSOLE_FONT_INFO info;
    GetCurrentConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &info);
    return info.dwFontSize.Y;
}

  • Como se trata de un fragmento, agrego #include y main() para imprimir getww() y getwh(). Cuando ejecuto eso, obtengo el tamaño de la FUENTE que se está utilizando, 12×7, NO el tamaño de la consola. ¿Estoy haciendo algo mal?

    – cniggeler

    29 de abril de 2021 a las 13:31

  • +1 por sugerir STD_ERROR_HANDLE para que el código de @quantum funcione si lo usa en un script o si necesita canalizar la salida.

    – cniggeler

    29 de abril de 2021 a las 13:38

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad