web-dev-qa-db-fra.com

Lecture de stdin

Quelles sont les manières possibles de lire une entrée utilisateur à l'aide de read() appel système sous Unix. Comment pouvons-nous lire octet par octet stdin en utilisant read()?

28
Bunny Bunny

Vous pouvez faire quelque chose comme ceci pour lire 10 octets:

char buffer[10];
read(STDIN_FILENO, buffer, 10);

rappelez-vous read () n'ajoute pas '\0' se terminer pour le transformer en chaîne (donne simplement un tampon brut).

Pour lire 1 octet à la fois:

char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
 //do stuff
}

et n'oubliez pas de #include <unistd.h>, STDIN_FILENO défini comme macro dans ce fichier.

Il existe trois descripteurs de fichier POSIX standard, correspondant aux trois flux standard, que tout processus devrait probablement avoir:

Integer value   Name
       0        Standard input (stdin)
       1        Standard output (stdout)
       2        Standard error (stderr)

Donc au lieu STDIN_FILENO vous pouvez utiliser 0.

Modifier:
Dans le système Linux, vous pouvez le trouver en utilisant la commande suivante:

$ Sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define'
/usr/include/unistd.h:#define   STDIN_FILENO    0   /* Standard input.  */

Remarquez le commentaire /* Standard input. */

30
Johnny Mnemonic

De la homme l :

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

Paramètres d'entrée:

  • int fd Le descripteur de fichier est un entier et non un pointeur de fichier. Le descripteur de fichier pour stdin est 0

  • void *buf pointeur sur tampon pour stocker les caractères lus par la fonction read

  • size_t count nombre maximum de caractères à lire

Vous pouvez donc lire caractère par caractère avec le code suivant:

char buf[1];

while(read(0, buf, sizeof(buf))>0) {
   // read() here read from stdin charachter by character
   // the buf[0] contains the character got by read()
   ....
}
7
MOHAMED