2013-04-08 3 views
17

Quali sono i modi possibili per leggere l'input dell'utente utilizzando la chiamata di sistema read() in Unix. Come possiamo leggere da stdin byte per byte usando read()?Lettura da stdin

+1

il tuo sho leggi read in 'read()' manual –

+0

Read lo farà bene, ma a seconda di cosa esattamente vuoi fare, potresti scoprire che devi fare qualcosa di più che semplicemente leggere read - puoi pubblicare il tuo codice e spiegare esattamente con quale parte hai problemi? –

+0

Sono d'accordo con Mats, cosa * scusabilmente * stai cercando qui? Dov'è il problema? [Ci sono] (http://stackoverflow.com/questions/9610064/read-stdin-in-c) anche un sacco di diversi [esempi] (http://stackoverflow.com/questions/7503399/reading-from- stdin-using-read-and-figuring-out-the-size-of-the-buffer) di come fare [questo su SO] (http://stackoverflow.com/questions/1237329/read-from-stdin- doesnt-ignore-newline), fai qualche ricerca prima di fare la domanda? – Mike

risposta

20

si può fare qualcosa di simile a leggere 10 byte:

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

ricordare read() non aggiunge '\0' di sospendere per renderlo stringa (dà solo tampone crudo).

Per leggere 1 byte alla volta:

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

e non dimenticate di #include <unistd.h>, STDIN_FILENO definito come macro in questo file.

Ci sono tre descrittori di file POSIX standard, corrispondenti alle tre flussi standard, che presumibilmente ogni processo deve aspettare di avere:

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

Così, invece STDIN_FILENO è possibile utilizzare 0.

Edit:
Nel sistema Linux è possibile trovare questo comando utilizzando:

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

Avviso il commento /* Standard input. */

+0

perché nella manpage usa la parola "will will". C'è qualche caso che leggere non leggerà esattamente il numero di byte specificato dal terzo argomento?https://linux.die.net/man/3/read – weefwefwqg3

5

Dal man read:

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

parametri di ingresso:

  • int fd descrittore di file è un numero intero e non un puntatore a file. Il descrittore di file per stdin è 0

  • void *buf puntatore al buffer di caratteri memorizzare leggere dalla funzione read

  • size_t count numero massimo di caratteri da leggere

Così si può leggere carattere per carattere con il seguente codice:

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' è un FILE! –

+0

Si potrebbe usare 'int fileno (flusso FILE *) prima –

+0

Effettivamente grazie per le osservazioni. risposta aggiornata – MOHAMED