Чтение из stdin

Каковы возможные способы чтения пользовательского ввода с использованием системного вызова read() в Unix. Как мы можем читать из stdin byte by byte с помощью read()?

Ответ 1

Вы можете сделать что-то вроде этого, чтобы прочитать 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.

Edit:
В системе Linux вы можете найти это, используя следующую команду:

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

Обратите внимание на комментарий /* Standard input. */

Ответ 2

Из человек прочитал:

#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()
   ....
}