Каковы возможные способы чтения пользовательского ввода с использованием системного вызова read()
в Unix. Как мы можем читать из stdin byte by byte с помощью read()
?
Чтение из stdin
Ответ 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()
....
}