2013-04-08 179 views
17

在Unix中使用read()系統調用讀取用戶輸入的可能方法是什麼?我們如何使用read()來從字節讀取字節?從stdin讀取

+1

你的笑(讀)手冊 – 2013-04-08 15:50:48

+0

閱讀將做到這一點很好,但根據你想要做什麼,你可能會發現,你必須做的不僅僅是調用讀 - 你可以發佈你的代碼,並準確解釋哪一部分你有問題? – 2013-04-08 15:53:27

+0

我同意Mats,你在這裏尋找什麼* excatly *?哪裏有問題? [有](http://stackoverflow.com/questions/9610064/read-stdin-in-c)也有很多不同的[示例](http://stackoverflow.com/questions/7503399/reading-from- stdin-using-read-and-fi-out-the-size-of-the-buffer)如何做到這一點[this on this](http://stackoverflow.com/questions/1237329/read-from-stdin- doesnt-ignore-newline),你在問這個問題之前做了什麼搜索? – Mike 2013-04-08 16:09:40

回答

20

你可以做這樣的事情來讀取10個字節:

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

記得read()不添加'\0'終止使它字符串(只是給原始緩衝區)。

要一次讀取1個字節:

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

,不要忘了#include <unistd.h>STDIN_FILENO定義爲在該文件中的宏。

有三個標準POSIX文件描述符,對應於三個標準流,這大概每一道工序都要準備好:

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

所以不是STDIN_FILENO你可以使用0

編輯:
在Linux的系統,你可以找到這個使用下面的命令:

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

通知的註釋/* Standard input. */

+0

爲什麼在聯機幫助頁中,它使用「將嘗試」一詞。是否有任何情況下讀取不會完全讀取由第三個參數指定的字節數?https://linux.die.net/man/3/read – weefwefwqg3 2017-11-13 01:08:28

5

man read

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

輸入參數:

  • int fd文件描述符是一個整數,而不是一個文件指針。對於stdin的文件描述符0

  • void *buf指針來緩衝由read功能來讀取存儲字符

  • size_t count最大字符數讀

所以,你可以通過字符讀取字符用以下代碼:

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

嗯。 'stdin'是一個文件! – 2013-04-08 15:54:16

+0

您可以使用'int fileno(FILE * stream)'首先 – 2013-04-08 15:57:17

+0

謝謝您的評論。答案已更新 – MOHAMED 2013-04-08 15:58:45