Cet exemple est un peu long, mais je pense que c'est le moyen le plus portable de détecter les dimensions du terminal. Cela gère également les événements de redimensionnement.
Comme le suggèrent tim et rlbond, j'utilise ncurses. Il garantit une grande amélioration de la compatibilité du terminal par rapport à la lecture directe des variables d'environnement.
#include <ncurses.h>
#include <string.h>
#include <signal.h>
// SIGWINCH is called when the window is resized.
void handle_winch(int sig){
signal(SIGWINCH, SIG_IGN);
// Reinitialize the window to update data structures.
endwin();
initscr();
refresh();
clear();
char tmp[128];
sprintf(tmp, "%dx%d", COLS, LINES);
// Approximate the center
int x = COLS / 2 - strlen(tmp) / 2;
int y = LINES / 2 - 1;
mvaddstr(y, x, tmp);
refresh();
signal(SIGWINCH, handle_winch);
}
int main(int argc, char *argv[]){
initscr();
// COLS/LINES are now set
signal(SIGWINCH, handle_winch);
while(getch() != 27){
/* Nada */
}
endwin();
return(0);
}
Avez-vous pensé à utiliser getenv() ? Il vous permet d'obtenir les variables d'environnement du système qui contiennent les colonnes et les lignes des terminaux.
Alternativement, en utilisant votre méthode, si vous voulez voir ce que le noyau voit comme la taille du terminal (mieux si le terminal est redimensionné), vous devrez utiliser TIOCGWINSZ, par opposition à votre TIOCGSIZE, comme ceci :
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
et le code complet :
#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
}