从stdin读取

Bun*_*nny 29 c unix stdin

read()在Unix中使用系统调用读取用户输入的可能方法是什么.我们如何使用字节逐字节读取stdin read()

Joh*_*nic 32

您可以执行以下操作来读取10个字节:

char buffer[10];
read(STDIN_FILENO, buffer, 10);
Run Code Online (Sandbox Code Playgroud)

记得read()没有添加'\0'到终止使它成为字符串(只是给出原始缓冲区).

要一次读取1个字节:

char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
 //do stuff
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记#include <unistd.h>,STDIN_FILENO在此文件中定义为宏.

有三个标准POSIX文件描述符,对应于三个标准流,可能每个进程都应该具有:

Integer value   Name
       0        Standard input (stdin)
       1        Standard output (stdout)
       2        Standard error (stderr)
Run Code Online (Sandbox Code Playgroud)

所以STDIN_FILENO你可以使用0.

编辑:
在Linux系统中,您可以使用以下命令找到它:

$ sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define'
/usr/include/unistd.h:#define   STDIN_FILENO    0   /* Standard input.  */
Run Code Online (Sandbox Code Playgroud)

注意评论 /* Standard input. */


MOH*_*MED 8

男人那里读到:

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

输入参数:

  • int fd文件描述符是一个整数而不是文件指针.stdinis的文件描述符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()
   ....
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯.`stdin`是一个文件! (9认同)
  • 您可以首先使用“int fileno(FILE *stream)” (2认同)