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()
?
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. */
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()
....
}