2013-04-08 19 views
17

Was sind die Möglichkeiten für das Lesen von Benutzereingaben mit read() Systemaufruf in Unix sind. Wie können wir Byte für Byte von stdin lesen mit read()?von stdin lesen

+1

Ihre sho ull lesen ''lesen()' Handbuch lesen –

+0

Lesen wird dies ganz gut tun, aber je nachdem, was genau Sie tun möchten, können Sie mehr als nur lesen zu tun - können Sie Ihren Code eingeben und genau erklären Mit welchem ​​Teil hast du Probleme? –

+0

Ich stimme Mats zu, was * excatly * suchst du hier? Wo ist das Problem? [Es gibt] (http://stackoverflow.com/questions/9610064/read-stdin-in-c) auch viele verschiedene [Beispiele] (http://stackoverflow.com/questions/7503399/reading-from- "stdin-using-read-and-finding-out-the-size-of-the-buffer" für die Vorgehensweise [this on SO] (http://stackoverflow.com/questions/1237329/read-from-stdin- doesnt-ignore-newline), machen Sie irgendwelche Suchvorgänge, bevor Sie die Frage stellen? – Mike

Antwort

20

Sie so etwas wie dieses 10 Byte lesen tun können:

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

read() erinnere mich nicht '\0' fügt zu beenden, es Zeichenfolge zu machen (gibt nur rohe Puffer).

um 1 Byte zu einem Zeitpunkt zu lesen:

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

und vergessen Sie nicht zu #include <unistd.h>, STDIN_FILENO in dieser Datei als Makro definiert.

Es gibt drei Standard-POSIX-Dateibeschreibungen, zu den drei Standardströmen entsprechen, die vermutlich sollte jeder Prozess erwarten zu haben:

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

Statt STDIN_FILENO Sie 0.

bearbeiten können:
In Linux-System können Sie dies mit folgendem Befehl finden:

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

Hinweis Kommentar /* Standard input. */

+0

Warum in der Manpage verwendet wird das Wort "soll versuchen". Gibt es einen Fall, dass Lesen nicht genau die Anzahl der Bytes liest, die durch das 3. Argument angegeben wurde?https://linux.die.net/man/3/lesen – weefwefwqg3

5

Vom man read:

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

Eingabeparameter:

  • int fd Dateideskriptor ist eine ganze Zahl und nicht ein Dateizeiger. Der Dateideskriptor für stdin ist 0

  • void *buf Zeiger zum Speichern von Zeichen durch die read Funktion

  • size_t count maximale Anzahl von Zeichen So

lesen lesen puffern können Sie Zeichen für Zeichen lesen mit dem folgenden 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() 
    .... 
} 
+7

Hmm. 'stdin' ist eine Datei! –

+0

Sie könnten 'int fileno (FILE * stream)' zuerst verwenden –

+0

In der Tat danke für die Anmerkungen. Antwort aktualisiert – MOHAMED