Comment utiliser select() pour lire l'entrée à partir du clavier en C
Je suis en train d'utiliser select() pour lire les entrées au clavier et je me suis coincé car je ne sais pas comment faire pour lire à partir d'un clavier et d'utiliser un descripteur de fichier pour le faire. J'ai été dit d'utiliser l'entrée standard STDIN et STDIN_FILENO à l'approche de ce problème, mais je suis encore confus.
Comment puis-je le faire?
C'est assez difficile à faire si vous n'êtes pas familier avec POSIX programmation en général. Pour une chose, vous devez définir le terminal modes de l'appareil n'a pas de tampon de caractères reçus.
Pas besoin d'utiliser select( ), sauf s'il fait partie d'un devoir à la maison. Vous pouvez simplement fread( STDIN ... ) ou lire( STDIN_FILENO ... ).
Si vous avez besoin d'un terminal de contrôle (clé de presses, etc.), vous aurez plus de chances être bien mieux à l'aide d'un terminal de la bibliothèque comme ncurses (il y a des Fenêtres ports, trop).
Pete Wilson: fread(stdin ...) ne fait pas revenir le plus rapidement sélectionner, si un message arrive sur un support avant que l'utilisateur appuie sur une touche. Dans Linux, j'ai utilisé sélectionner. Sous Windows, c'est plus difficile.
Pouvez-vous préciser pourquoi vous devez aller pour sélectionnez pour lire une entrée de clavier ? Normalement, sélectionnez appels doit être utilisé lorsque vous avez besoin pour lire à partir d'une série de descripteurs ou des intrants car elle permettent à un programme de surveillance de plusieurs descripteurs de fichier, en attente jusqu'à ce que l'un ou plusieurs des descripteurs de fichiers devenir "prêts" pour une certaine classe de l'opération d'e/S (p. ex., entrée possible).
Pas besoin d'utiliser select( ), sauf s'il fait partie d'un devoir à la maison. Vous pouvez simplement fread( STDIN ... ) ou lire( STDIN_FILENO ... ).
Si vous avez besoin d'un terminal de contrôle (clé de presses, etc.), vous aurez plus de chances être bien mieux à l'aide d'un terminal de la bibliothèque comme ncurses (il y a des Fenêtres ports, trop).
Pete Wilson: fread(stdin ...) ne fait pas revenir le plus rapidement sélectionner, si un message arrive sur un support avant que l'utilisateur appuie sur une touche. Dans Linux, j'ai utilisé sélectionner. Sous Windows, c'est plus difficile.
Pouvez-vous préciser pourquoi vous devez aller pour sélectionnez pour lire une entrée de clavier ? Normalement, sélectionnez appels doit être utilisé lorsque vous avez besoin pour lire à partir d'une série de descripteurs ou des intrants car elle permettent à un programme de surveillance de plusieurs descripteurs de fichier, en attente jusqu'à ce que l'un ou plusieurs des descripteurs de fichiers devenir "prêts" pour une certaine classe de l'opération d'e/S (p. ex., entrée possible).
OriginalL'auteur drum | 2011-06-20
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la question paraît un peu confus.
select()
est utilisé pour bloquer jusqu'à ce que l'entrée est disponible. Mais vous ne la lecture normale lecture de fichiers fonctions (commeread
,fread
,fgetc
, etc.).Voici un exemple rapide. Il bloque jusqu'à ce que stdin a au moins un caractère disponibles pour la lecture. Mais bien sûr, sauf si vous changez de terminal pour certains crus mode, il bloque jusqu'à ce que vous appuyez sur entrée, quand tous les caractères tapés sont vidées dans la mémoire tampon de fichier (à partir de certains terminaux de la mémoire tampon).
OriginalL'auteur luser droog
Comme il a déjà été dit, en utilisant sélectionnez vous pouvez juste moniteur par exemple, stdin pour vérifier si les données d'entrée sont déjà disponibles pour la lecture ou pas. Si elle est disponible, vous pouvez utiliser, par exemple, fgets en toute sécurité de lire les données d'entrée pour certains tampon, comme indiqué ci-dessous:
OriginalL'auteur jwaliszko
Peut-être, vous voulez la façon de jeter le clavier sur "WINDOWS"?
Sur windows, il ne peut pas obtenir le résultat de select() pour l'entrée standard. Vous devez utiliser PeekConsoleInput().
Et l'utilisation de la poignée de stdin comme suit.
stdin peut devenir tuyau d'entrée. si oui, vous n'obtenez pas de clavier d'entrée.
P. S. Si vous ne posez pas de questions sur Windows, Désolé beaucoup.
OriginalL'auteur mattn