Wat zijn de mogelijke manieren om gebruikersinvoer te lezen met behulp van read()
systeemaanroep in Unix. Hoe kunnen we van stdin byte voor byte lezen met read()
?
Antwoord 1, autoriteit 100%
Je kunt zoiets als dit doen om 10 bytes te lezen:
char buffer[10];
read(STDIN_FILENO, buffer, 10);
onthoud read()voegt '\0'
om te beëindigen om er een string van te maken (geeft alleen een onbewerkte buffer).
Om 1 byte tegelijk te lezen:
char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
//do stuff
}
en vergeet niet om #include <unistd.h>
, STDIN_FILENO
gedefinieerd als macro in dit bestand.
Er zijn drie standaard POSIX-bestandsdescriptors, die overeenkomen met de drie standaardstreams, die vermoedelijk elk proces zou moeten hebben:
Integer value Name
0 Standard input (stdin)
1 Standard output (stdout)
2 Standard error (stderr)
Dus in plaats STDIN_FILENO
kun je 0 gebruiken.
Bewerken:
In Linux System kun je dit vinden met het volgende commando:
$ sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define'
/usr/include/unistd.h:#define STDIN_FILENO 0 /* Standard input. */
Let op de opmerking /* Standard input. */
Antwoord 2, autoriteit 26%
Van de man gelezen:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Invoerparameters:
-
int fd
Bestandsdescriptor is een geheel getal en geen bestandsaanwijzer. De bestandsdescriptor voorstdin
is0
-
void *buf
POSER OF BUFFER OM PERSOURS TE STOELT LEES DOOR DEread
FUNCTION -
size_t count
MAXIMAAL Aantal tekens om
te lezen
, zodat u het karakter per teken kunt lezen met de volgende code:
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()
....
}