Чтение со стандартного ввода

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

 Mike08 апр. 2013 г., 18:09
Я согласен с Матсом, чтовсе тоже ты ищешь здесь? В чем проблема?Есть также много разныхПримеры как это сделатьэто на ТАКВы занимаетесь поиском, прежде чем задать вопрос?
 Mats Petersson08 апр. 2013 г., 17:53
Read сделает это просто отлично, но в зависимости от того, что именно вы хотите сделать, вы можете обнаружить, что вам нужно сделать больше, чем просто вызвать read - можете ли вы опубликовать свой код и точно объяснить, с какой частью у вас проблемы?
 Grijesh Chauhan08 апр. 2013 г., 17:50
Вы должны прочитать вread() руководство

Ответы на вопрос(2)

Вы можете сделать что-то вроде этого, чтобы прочитать 10 байтов:

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

Помнитечитать() Безразлично»т добавить'\0' завершить, чтобы сделать его строкой (просто дает необработанный буфер).

Чтобы прочитать 1 байт за раз:

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

и не надоне забудь,#include STDIN_FILENO определяется как макрос в этом файле.

Существует три стандартных файловых дескриптора POSIX, соответствующих трем стандартным потокам, которые, вероятно, должен иметь каждый процесс:

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

Так что вместоSTDIN_FILENO Вы можете использовать 0.

Редактировать:

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

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

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

 camerondm917 февр. 2019 г., 02:32
@ weefwefwqg3 read () будет читать меньше байтов, чем запрошено, если оно прервано сигналом или если доступно меньше байтов, чем запрошено, и т. д.
 weefwefwqg313 нояб. 2017 г., 02:08
почему в справочной странице используется слово "постараюсь, Есть ли какой-либо случай, когда read не прочитает точно количество байтов, указанное в 3-м аргументе?linux.die.net/man/3/read

Отчеловек читал:

#include 
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()
   ....
}
 Mats Petersson08 апр. 2013 г., 17:54
Хм.stdin это файл!
 Grijesh Chauhan08 апр. 2013 г., 19:10
@MOHAMED Продолжайте, MOHAMED, чтобы улучшить свой ответ: добавьте два пункта (1), которые вы можете просто прочитать, используя;char cread(0, &c, 1)  , (2) функция чтения () непрекратить входной буфер с\0 сfgets() делать. Так что в случае, если кто-то хочет использовать буфер в качестве строки, он должен явно добавить нуль, например:no_byte = read(0, buffer, sizeof(buffer)-1); buffer[no_bytes] = '\0';  Это точка, где новые парни делают ошибки. как вэтот вопрос прочитайте вторую ошибку ... вперёд, это то, что я хотел добавить.
 MOHAMED08 апр. 2013 г., 17:58
Действительно, спасибо за замечания. ответ обновлен
 MOHAMED08 апр. 2013 г., 18:42
@Mike ответ обновлен на основе ваших замечаний с Grijesh
 Mike08 апр. 2013 г., 18:15
@Grijesh - Вы можете сделать еще один шаг вперед,stdin будет 0, так что вы можете простоread(0,... Дон»не нужно искать вокругstdinномер файла s в системах * NIX
 MOHAMED08 апр. 2013 г., 18:43
@Grijesh ответ обновлен на основе ваших замечаний с Майком
 weefwefwqg313 нояб. 2017 г., 02:09
почему в справочной странице используется слово "постараюсь, Есть ли какой-либо случай, когда read не прочитает точно количество байтов, указанное в 3-м аргументе?linux.die.net/man/3/read
 Grijesh Chauhan08 апр. 2013 г., 17:57
Вы могли бы использоватьint fileno(FILE *stream) первый
 Grijesh Chauhan08 апр. 2013 г., 18:24
@ Майк Да, я,stdin = 0stdout = 1stderr = 2 и хорошо это то же самое для всех ОС.
 MOHAMED08 апр. 2013 г., 18:53
@GrijeshChauhan Я не собираюсь это делать, я обновил его на основе ваших замечаний
 Grijesh Chauhan08 апр. 2013 г., 18:47
@MOHAMED подожди, неЯ не могу удалить ваш ответ. Через некоторое время я добавлю некоторые детали.

Ваш ответ на вопрос