J'ai cherché un moyen d'obtenir la largeur du terminal à partir de mon programme C. Ce que je n'arrête pas de proposer, c'est quelque chose du genre:
#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'essaye d'avoir
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 procéder ou y a-t-il une meilleure façon de procéder? Sinon, comment puis-je faire fonctionner cela?
EDIT: le 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;
}
Réponses:
Avez-vous envisagé d'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 considère comme la taille du terminal (mieux si le terminal est redimensionné), vous devrez utiliser TIOCGWINSZ, par opposition à votre TIOCGSIZE, comme ceci:
et le code complet:
la source
ws_xpixel
etws_ypixel
, mais il imprime juste des zéros!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.
la source
man 7 signal
OK
etERR
. Comment "gentils" de leur part pour nous aider à combler cette lacune dans nos vies :-(Doit être compilé avec
-ltermcap
. Il y a beaucoup d'autres informations utiles que vous pouvez obtenir en utilisant termcap. Consultez le manuel de termcapinfo termcap
pour plus de détails.la source
Si vous avez installé ncurses et que vous l'utilisez, vous pouvez utiliser
getmaxyx()
pour trouver les dimensions du terminal.la source
En supposant que vous soyez sous Linux, je pense que vous souhaitez utiliser la bibliothèque ncurses à la place. Je suis à peu près sûr que le contenu de ttysize que vous avez n'est pas dans stdlib.
la source
ioctl
manière est plus simple et plus propre, car vous n'avez pas à initialiser les malédictions, etc.Donc, je ne suggère pas de réponse ici, mais:
linux-pc:~/scratch$ echo $LINES
49
linux-pc:~/scratch$ printenv | grep LINES
linux-pc:~/scratch$
Ok, et je remarque que si je redimensionne le terminal GNOME, les variables LINES et COLUMNS suivent cela.
Il semble que le terminal GNOME crée lui-même ces variables d'environnement?
la source
Pour ajouter une réponse plus complète, ce que j'ai trouvé qui fonctionne pour moi, c'est d'utiliser la solution de @ John_T avec quelques bits ajoutés à partir de Rosetta Code , ainsi que du dépannage pour déterminer les dépendances. Cela peut être un peu inefficace, mais avec une programmation intelligente, vous pouvez le faire fonctionner et ne pas ouvrir votre fichier de terminal tout le temps.
Si vous vous assurez de ne pas tout appeler, mais peut-être de temps en temps, cela devrait aller, il devrait même être mis à jour lorsque l'utilisateur redimensionne la fenêtre du terminal (car vous ouvrez le fichier et le lisez à chaque fois).
Si vous n'utilisez pas,
TIOCGWINSZ
voyez la première réponse sur ce formulaire https://www.linuxquestions.org/questions/programming-9/get-width-height-of-a-terminal-window-in-c-810739/ .Oh, et n'oubliez pas
free()
leresult
.la source
Voici les appels de fonction pour la variable environnementale déjà suggérée:
la source
SIGWINCH
signal, afin qu'ils puissent garder les variables à jour (ils en ont également besoin afin de faire un wrapping de ligne approprié dans l'éditeur d'entrée).getenv()
renvoie NULL ou non et c'est le cas dans mon terminal Linux (car ces variables ne sont pas exportées.) De plus, même si le shell met à jour ces variables, vous ne verriez pas le change pendant que votre programme est en cours d'exécution (pas sans que vous ayez votre propreSIGWINCH
gestionnaire).