web-dev-qa-db-fra.com

Obtenir la taille de la fenêtre du terminal (lignes / colonnes)

Existe-t-il un moyen fiable d'obtenir le nombre de colonnes/lignes de la fenêtre de terminal de sortie actuelle?

Je veux récupérer ces chiffres dans un programme C/C++.

Je recherche principalement une solution GNU/Linux, mais j'ai également besoin d'une solution Windows.

21
Vittorio Romeo

Pour Unix (basé sur), utilisez ioctl(2) et TIOCGWINSZ:


#include <sys/ioctl.h> //ioctl() and TIOCGWINSZ
#include <unistd.h> // for STDOUT_FILENO
// ...

struct winsize size;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &size);

/* size.ws_row is the number of rows, size.ws_col is the number of columns. */

// ...

De plus, même si je n'ai pas touché à Windows au cours des cinq dernières années, GetConsoleScreenBufferInfo() devrait vous aider à obtenir la taille de la fenêtre de la console.

22
Moshe Gottlieb

Sous Windows, utilisez le code suivant pour imprimer la taille de la fenêtre de la console (emprunté à ici ):

#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;
}

Sous Linux, utilisez plutôt ce qui suit (emprunté à ici ):

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

int main (int argc, char **argv)
{
    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;  // make sure your main returns int
}
36
herohuyongtao

Pour développer @herohuyongtao answer pour Windows. La propriété .srWindow donne la réponse à la taille de la fenêtre de la console, c'est-à-dire les lignes et les colonnes visibles. Cela ne dit pas quelle est la largeur et la hauteur du tampon d'écran réellement disponibles, qui pourraient être plus grandes si la fenêtre contient des barres de défilement. Si tel est le cas, utilisez .dwSize:

CONSOLE_SCREEN_BUFFER_INFO sbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbInfo);
int availableColumns = sbInfo.dwSize.X;
int availableRows = sbInfo.dwSize.Y;
3
Killzone Kid

Sur GNU/Linux en utilisant libtermcap ( https://www.gnu.org/software/termutils/manual/termcap-1.3/html_mono/termcap.html ) créez demo.c:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <term.h>

static char term_buffer[2048];

void
init_terminal_data (void)
{

  char *termtype = getenv ("TERM");
  int success;

  if (termtype == NULL)
    fprintf (stderr, "Specify a terminal type with `setenv TERM <yourtype>'.\n");

  success = tgetent (term_buffer, termtype);
  if (success < 0)
    fprintf (stderr, "Could not access the termcap data base.\n");
  if (success == 0)
    fprintf (stderr, "Terminal type `%s' is not defined.\n", termtype);
}

int
main ()
{
  init_terminal_data ();
  printf ("Got: Lines: %d, Columns: %d\n", tgetnum ("li"), tgetnum ("co"));
  return 0;
}

Compilez ensuite avec gcc -o demo.x demo.c -ltermcap et courez pour donner:

$ ./demo.x
Got: Lines: 24, Columns: 80

Je doute que cela aide beaucoup sur Windows, je ne connais pas cette plate-forme.

(Une partie de ce code est copiée directement de la documentation termcap.)

1
Andrew