Peut-on connaitre la taille d'une console sous linux dans un prog en C ?
Peut-on connaitre la taille d'une console sous linux dans un prog en C ?
Cette fonction te permettra de recuperer la taille du terminal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <sys/ioctl.h> void get_win_value(int *col, int *win) { struct winsize win; ioctl(0, TIOCGWINSZ, &win); /* aussi ioctl(0, TIOCGSIZE, &win); C'est la meme chose */ *col = win.ws_col; *win = win.ws_row; }
Salut,
j'ai une petite question par rapport au bout de code que tu as posté ci-dessus:
le premier argument de ioctl est un file descriptor en l'occurence celui du periphérique auquel on veut accedé. Alors ma question pourquoi 0 ? et pas :
??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int fd; fd = open("/dev/tty", O_RDWR); ioctl(fd, TIOCGWINSZ, &win);
J'avoue que jusqu'a présent je mettais aussi 0 comme premier argument et ca a toujours fonctionner mais je me posais la question comme ca !
Merci.[/code]
C'est une tres bonne question.Envoyé par -keiji-
J'utilise 0 car 0 correspond au bon /dev/ttyXY.
Mais tu peux tres bien faire un ttyname puis ouvrir et utiliser le fd.
Ou soit utiliser le /dev/tty qui correspond au terminal controlant le processus en cours.
Mais pourquoi s'embeter ?
Une excellente raison est que sur un code trivial de quelques lignes , ca ne pose pas de problème.
Par contre lorsque tu vas te retrouver avec un projet consequent, l'apparition de 'nombres magiques' est une calamité, tu ne sais pas d'ou ils viennent , ni a quoi ils correspondent.
Une autre excellentre raison de les éviter est que celafonctionne peut-être très bien chez toi à un moment donné... mais quid sur une autre machine ?
J'ai une autre proposition à te faire : utilise la librairie ncurses. C'est bien plus portable que ioctl ou /dev/ttyXX :-) C'est plus lourd car il faut lier ton programme à lncurses (qu'il faut donc avoir installé), puis il faut initialiser la console avec initscr(), et enfin ne jamais oublié endwin() (en cas de crash du programme, le terminal est "destabilité", il faut appeler la commande bash "reset" pour revenir à la normale).
Tu compiles avec "-lncurses".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <ncurses.h> WINDOW *win; // Initialise la console (surtout ne pas l'oublier !) void InitConsole (void) { // Initialise la librairie ncurses win = initscr(); // Active le scrolling dans la console scrollok (win,TRUE); // Utilise le scrolling "hardware" (si disponnible) idlok (win,TRUE); // N'affiche pas la touche press<E9>e (apr<E8>s getch par ex) noecho (); // Reconnait les touches sp<E9>ciales par leur identifiant keypad (win, TRUE); } // Ferme la console (surtout ne pas l'oublier !) void FinConsole (void) { endwin(); }
http://www.gnu.org/software/ncurses/
----
J'allais oublié : tu auras alors
- COLS = nombre de colonnes
- LINES = nombre de lignes
(qui peuvent varier durant l'exécution)
- move (x,y) : déplacer le curseur (0,0)=haut gauche
- getyx(win,y,x) : lire la position du curseur
- getch() : lire une touche. Renvoie un int, pour les touches "étendues" comme les touches fléchées le code est >256 grâce à keypad (win, TRUE) (sinon ça renvoie une liste de séquences d'échappement indigestes ...)
- clear() : efface l'écran
- deleteln() : efface la ligne en cours
- ...
ATTENTION: ne pas utiliser fgets(tampon,taille,stdin) pour la saisie mais getnstr(tampon,taille) :
Utiliser refresh() rafrachit l'écran, ce qui évite bien des surprises ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 echo(); // active l'écriture des touches lues getnstr(txt, taille); noecho(); // n'affiche plus les touches lues
Enfin : printf(...) est à remplacer par wprintf(win, ...).
---
Si tu trouves que ça fait bcp de boulot, utilise ma librairie hconsole qui fonctionne sous Windows, Cygwin, MinGW et Linux en utilisant des fonctions unifiées (il n'existe pas de portage officiel de ncurses sous Windows ...).
http://www.haypocalc.com/telecharge.php
(dans le code de HaypoCALC, répertoire include)
@+ Haypo
C'est exact, mais ici, nul besoin d'ouvrir le tty, il suffit d'utiliser la constante STDIN_FILENO à la place du 0Envoyé par LFE
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager