48

What are the possible ways for reading user input using read() system call in Unix. How can we read from stdin byte by byte using read()?

4

2 回答 2

51

您可以执行以下操作来读取 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. */

于 2013-04-08T15:52:23.510 回答
14

男人那里读到

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

输入参数:

  • int fd文件描述符是一个整数而不是文件指针。的文件描述符stdin0

  • 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()
   ....
}
于 2013-04-08T15:53:41.280 回答