Titre: [C] Lire sur l'entrée standard Posté par: The-Snake le 16 Février 2009 à 18:20:02 Bonsoir !
J'ai un petit peu de mal à lire sur l'entrée standard quand on sort de ce que peut contenir un char. Voici un exemple de code : Citation int buffer[2]; int n; while (n = read(0, buffer, 2)) printf("Touche => %d\n", buffer[0]); Donnera pour la même touche des résultats différents, en fonction du moment ou cette boucle est placé dans le programme... ou par exemple s'y on y passe plusieurs fois : la première fois les valeurs ne seront pas les même que la deuxième fois (bon, pas toujours, mais souvent). Le problème, c'est qu'à moins d'utiliser un tableau d'int, je ne peux pas reconnaître les touches telles que haut, bas, alt, ctrl... Et ça m'embête pas mal, d'autant plus qu'il n'y a pas masses de documentations là-dessus sur Internet (on s'est penché sur le problème avec un camarade et nous sommes revenus bredouille). Comment, en utilisant read(), pourrais-je alors reconnaître toutes les touches du clavier ? Titre: Re : [C] Lire sur l'entrée standard Posté par: lemulot le 16 Février 2009 à 23:32:05 Désoler, je peut pas trop t'aider. Je me suis pas encore penchée sur le probleme.
Cependant, je t'oriente sur cette page (http://www.epitech.eu/intra/index.php?section=elearning&page=view&id=57) (section Termcaps). Il y a un prog qui donne la valeur des touches. Il n'utilise pas le read, mais sa devrais etre traduisible Titre: Re : [C] Lire sur l'entrée standard Posté par: harvey le 17 Février 2009 à 00:22:00 Tu as oublié de nous donner tes identifiants epitech... Je suppose que tu n'as pas le droit de copier le contenu de votre intranet ici, mais le côté "forum corporatiste" est un peu irritant.
Titre: Re : [C] Lire sur l'entrée standard Posté par: the lsd le 17 Février 2009 à 08:17:47 Le problème, si je lis bien, vient de read, d'après ce que tu nous dis. Donc :
Man Read (http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/read.2.html) (ca marche aussi dans un shell pour la plupart des commandes C -> man read) Si le descripteur de fichier est 0, es tu sur que cela lit l'entrée standard (càd ton clavier) Enjoy The lsd Titre: Re : [C] Lire sur l'entrée standard Posté par: The-Snake le 17 Février 2009 à 10:40:46 Citation Tu as oublié de nous donner tes identifiants epitech... Je suppose que tu n'as pas le droit de copier le contenu de votre intranet ici, mais le côté "forum corporatiste" est un peu irritant. Effectivement je pense pas qu'on ait le droit de filer le contenu de l'intranet epitech.De plus je préférerais quand même le faire avec read... le problème c'est que j'ai fait pas mal de boulot comme ça et que comme je n'y arrivais pas ainsi, j'ai du trouver des compromis... et maintenant j'aimerais bien savoir pourquoi je n'y arrivais pas de cette façon. Citation Le problème, si je lis bien, vient de read, d'après ce que tu nous dis. Donc : Man Read (ca marche aussi dans un shell pour la plupart des commandes C -> man read) Citation read() lit jusqu'à count octets depuis le descripteur de fichier fd dans le tampon pointé par buf. Après relecture du main, j'ai testé un read(1, buffer, sizeof(int) * taille du buffer) et effectivement ça semble marcher beaucoup mieux.C'est donc bien cela ? Titre: Re : Re : [C] Lire sur l'entrée standard Posté par: _o_ le 17 Février 2009 à 12:02:38 De plus je préférerais quand même le faire avec read... La question est : pourquoi ? Citation Après relecture du main, j'ai testé un read(1, buffer, sizeof(int) * taille du buffer) et effectivement ça semble marcher beaucoup mieux. Plusieurs remarques :
Titre: Re : [C] Lire sur l'entrée standard Posté par: The-Snake le 24 Février 2009 à 19:26:44 Shei? encoding disait un célèbre t-shirt !
Citation La question est : pourquoi ? Pourquoi pas ? Ca m'a l'air plus court et plus simple à gérer... je sais pas vraiment quelles sont les alternatives mais ça me fait plaisir de pas avoir à faire intérvenir une autre bibliothèque.Et l'utilisation de read implique l'utilisation d'un tableau d'int pour stocker des char, pour les caractères qui ne peuvent pas rentrer dans un char. Il y a des moyens plus simples et plus efficaces ? Titre: Re : Re : [C] Lire sur l'entrée standard Posté par: the lsd le 25 Février 2009 à 08:23:15 Ca m'a l'air plus court et plus simple à gérer... je sais pas vraiment quelles sont les alternatives mais ça me fait plaisir de pas avoir à faire intérvenir une autre bibliothèque. La question n'est pas de savoir si c'est plus simple pour toi, mais surtout si c'est plus efficace/rapide pour l'utilisateur final. Bien sur, il faut voir aussi en terme de poids du programme final (ne pas inclure trop de librairies non plus). Perso j'opterais quand même pour l'efficacité/rapidité. On est plus à quelques ko près de nos jours. Quels caractères ne peuvent pas rentrer dans un type char selon toi ? Enjoy The lsd Titre: Re : [C] Lire sur l'entrée standard Posté par: The-Snake le 25 Février 2009 à 09:59:14 Les flêches directionnelles, la tabulation, contrôle, alt, les F1-F12, Echap...
J'ai jamais pu en tirer quoique ce soit avec un tableau de char. Pour l'utilisateur final, ça ne revient pas à la même chose ? Titre: Re : Re : [C] Lire sur l'entrée standard Posté par: _o_ le 25 Février 2009 à 10:39:21 Et l'utilisation de read implique l'utilisation d'un tableau d'int pour stocker des char, pour les caractères qui ne peuvent pas rentrer dans un char. Autant pour moi, je n'avais pas regardé le man avant de répondre. Les flêches directionnelles, la tabulation, contrôle, alt, les F1-F12, Echap... Bon, chez moi, les programmes interactifs, ça n'existe pas (ou alors ce sont des IHMs de plus haut niveau). Cela dit il me semble qu'il y a des librairies toutes faites pour gérer les entrées utilisateurs interactives. Au hasard, j'ai entendu parler de readline. Par contre, je n'ose pas imaginer l'usine à gaz que cela doit être. Titre: Re : [C] Lire sur l'entrée standard Posté par: crocrodile le 05 Avril 2009 à 10:50:44 Pour pouvoir lire l'entrée standard caractère par caractère en obtenant aussi tous les caractères de contrôle, il faut configurer le descripteur de STDIN avec l'ensemble des fonctions TERMIOS. En désactivant le mode canonique (ICANON), l'echo (ECHO) et en paramétrant la taille du buffer d'entrée (VMIN) à 1, tu devrais pouvoir utiliser read() comme tu le souhaite.
Plus d'infos: http://www.sim07.net/man/francais/man3/cfsetospeed.3.php Il y a de bons paragraphes sur le mode non-canonique et le mode brut. |