L'obtention de terminal largeur en C?
J'ai été à la recherche d'un moyen d'obtenir le terminal de la largeur de l'intérieur de mon programme C. Ce que j'ai de garder à venir avec quelque chose le long des lignes de:
#include <sys/ioctl.h>
#include <stdio.h>
int main (void)
{
struct ttysize ts;
ioctl(0, TIOCGSIZE, &ts);
printf ("lines %d\n", ts.ts_lines);
printf ("columns %d\n", ts.ts_cols);
}
Mais chaque fois que j'essaie, que je reçois
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.)
Est-ce la meilleure façon de le faire, ou est-il un meilleur moyen? Si non, comment puis-je obtenir que cela fonctionne?
EDIT: code fixe est
#include <sys/ioctl.h>
#include <stdio.h>
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;
}
- aucune des réponses proposées n'est plus de la moitié correcte.
Vous devez vous connecter pour publier un commentaire.
Avez-vous envisagé d'utiliser la fonction getenv() ? Il vous permet d'obtenir le système de variables d'environnement qui contient les bornes de colonnes et de lignes.
Alternativement à l'aide de votre méthode, si vous voulez voir ce que le noyau voit que la taille du terminal (mieux dans le cas où le terminal est redimensionnée), vous devez utiliser TIOCGWINSZ, par opposition à votre TIOCGSIZE, comme suit:
et le code complet:
#include <unistd.h>
pourSTDOUT_FILENO
.ws_xpixel
etws_ypixel
, Mais il se contente d'afficher les zéros !Cet exemple est un peu sur le long côté, mais je crois que c'est le plus portable moyen de détecter les dimensions du terminal. Ce gère également les événements de redimensionnement.
Comme tim et rlbond l'indique, je suis en utilisant ncurses. Il garantit une grande amélioration dans le terminal de compatibilité par rapport à la lecture des variables d'environnement directement.
man 7 signal
Doit être compilé avec
-ltermcap
. Il y a beaucoup d'autres informations utiles que vous pouvez obtenir à l'aide de termcap. Vérifiez le termcap manuel à l'aide deinfo termcap
pour plus de détails.Si vous avez ncurses installés et en l'utilisant, vous pouvez utiliser
getmaxyx()
pour trouver les dimensions du terminal.En supposant que vous êtes sur Linux, je pense que vous voulez utiliser la ncurses bibliothèque
au lieu de cela. Je suis assez sûr que la ttysize trucs que vous avez n'est pas dans stdlib.
ioctl
moyen est plus simple et plus propre, parce que vous n'avez pas à initialiser les malédictions, etc.Afin de ne pas suggérer une réponse ici, mais:
linux-pc:~/scratch$ echo $LINES
49
linux-pc:~/scratch$ printenv | grep LINES
linux-pc:~/scratch$
Ok, et j'ai remarqué que si je redimensionner le terminal de GNOME, les LIGNES et les COLONNES les variables de le suivre.
Semble un peu comme GNOME terminal est la création de ces variables d'environnement lui-même?
Voici les appels de fonction pour le déjà suggéré variable d'environnement de chose:
SIGWINCH
signal, afin qu'ils puissent garder les variables à jour (ils ont aussi besoin de sorte qu'ils vont faire le bon retour à la ligne dans l'éditeur de saisie).