logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C] Lire sur l'entrée standard
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] Lire sur l'entrée standard  (Lu 18727 fois)
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« 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 ?
Journalisée
lemulot

Profil challenge

Classement : 6039/54283

Néophyte
*
Hors ligne Hors ligne
Messages: 34

{EPITECH.}


Voir le profil
« #1 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 (section Termcaps).
Il y a un prog qui donne la valeur des touches. Il n'utilise pas le read, mais sa devrais etre traduisible
Journalisée
harvey

Profil challenge

Classement : 12/54283

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #2 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.
Journalisée

L'entropie vient en mangeant.
the lsd
Administrateur

Profil challenge

Classement : 190/54283

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #3 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 (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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #4 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 ?
« Dernière édition: 17 Février 2009 à 10:47:46 par The-Snake » Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54283

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #5 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 :
  • d'une part, d'habitude, sur les Unix, stdin est 0, stdout est 1 et stderr est 2. Côté portabilité, je pense que le plus propre est d'utiliser fileno(stdin).
  • d'autre part, j'ai un peu de mal à piger pourquoi tu utilises des int pour stocker des char...
  • enfin, pour terminer : le monde a (beaucoup) évolué depuis ASCII. Et donc, pour plein de raisons, il est vain de croire que l'on peut faire tenir un caractère sur 8 bits. Aaaah, les problèmes d'encodage...
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #6 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 ?
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 190/54283

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #7 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
« Dernière édition: 25 Février 2009 à 11:47:11 par the lsd » Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #8 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 ?
Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54283

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #9 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.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
crocrodile
Profil challenge

Classement : 4570/54283

Néophyte
*
Hors ligne Hors ligne
Messages: 13


Voir le profil
« #10 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.
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: