Lezen van stdin

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_FILENOgedefinieerd 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_FILENOkun 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 fdBestandsdescriptor is een geheel getal en geen bestandsaanwijzer. De bestandsdescriptor voor stdinis 0

  • void *bufPOSER OF BUFFER OM PERSOURS TE STOELT LEES DOOR DE readFUNCTION

  • size_t countMAXIMAAL 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()
   ....
}

Other episodes