Obtener ancho de terminal en C?

He estado buscando una manera de obtener el ancho del terminal desde mi progtwig C. Lo que sigo teniendo es algo como:

#include  #include  int main (void) { struct ttysize ts; ioctl(0, TIOCGSIZE, &ts); printf ("lines %d\n", ts.ts_lines); printf ("columns %d\n", ts.ts_cols); } 

Pero cada vez que trato de obtener

 austin@:~$ gcc test.c -o test test.c: In function 'main': test.c:6: error: storage size of 'ts' isn't known test.c:7: error: 'TIOCGSIZE' undeclared (first use in this function) test.c:7: error: (Each undeclared identifier is reported only once test.c:7: error: for each function it appears in.) 

¿Es esta la mejor manera de hacer esto, o hay una mejor manera? Si no, ¿cómo puedo hacer que esto funcione?

EDITAR: el código fijo es

 #include  #include  int main (void) { struct winsize w; ioctl(0, TIOCGWINSZ, &w); printf ("lines %d\n", w.ws_row); printf ("columns %d\n", w.ws_col); return 0; } 

¿Has considerado usar getenv () ? Le permite obtener las variables de entorno del sistema que contienen las columnas y líneas de los terminales.

Alternativamente, usando su método, si quiere ver lo que el kernel ve como el tamaño de la terminal (mejor en caso de que la terminal se cambie de tamaño), necesitaría usar TIOCGWINSZ, a diferencia de TIOCGSIZE, así:

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

y el código completo:

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

Este ejemplo es un poco largo, pero creo que es la forma más portátil de detectar las dimensiones de la terminal. Esto también maneja eventos de cambio de tamaño.

Como sugieren tim y rlbond, estoy usando ncurses. Garantiza una gran mejora en la compatibilidad del terminal en comparación con las variables del entorno de lectura directamente.

 #include  #include  #include  // 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); } 
 #include  #include  #include  #include  static char termbuf[2048]; int main(void) { char *termtype = getenv("TERM"); if (tgetent(termbuf, termtype) < 0) { error(EXIT_FAILURE, 0, "Could not access the termcap data base.\n"); } int lines = tgetnum("li"); int columns = tgetnum("co"); printf("lines = %d; columns = %d.\n", lines, columns); return 0; } 

Necesita ser comstackdo con -ltermcap . Hay mucha otra información útil que puede obtener usando termcap. Consulte el manual de termcap usando info termcap para obtener más detalles.

Si tiene ncurses instalado y lo está usando, puede usar getmaxyx() para encontrar las dimensiones del terminal.

Suponiendo que está en Linux, creo que desea utilizar la biblioteca ncurses en su lugar. Estoy bastante seguro de que las cosas que tienes no están en stdlib.

Aquí están las llamadas de función para la variable de entorno ya sugerida:

 int lines = atoi(getenv("LINES")); int columns = atoi(getenv("COLUMNS"));