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
risposta
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. */
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
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 perstdin
è0
void *buf
puntatore al buffer di caratteri memorizzare leggere dalla funzioneread
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()
....
}
Hmm. 'stdin' è un FILE! –
Si potrebbe usare 'int fileno (flusso FILE *) prima –
Effettivamente grazie per le osservazioni. risposta aggiornata – MOHAMED
il tuo sho leggi read in 'read()' manual –
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? –
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