Как насчет этого:
#define BUFFER_SIZE 10
char buffer[BUFFER_SIZE];
/* ... */
size_t total_read = 0;
size_t total_left = BUFFER_SIZE; /* The total size of the buffer */
char *buffer_pointer = buffer; /* buffer is where to store the data */
while (total_left > 0)
{
ssize_t current = read(STDIN_FILENO, buffer_pointer, total_left);
if (current <= 0)
{
/* Error or end of file */
if (current < 0)
perror("read"); /* Error! */
break;
}
else
{
total_read += current; /* We have read some more data */
total_left -= current; /* Less data left to read */
buffer_pointer += current; /* So we don't read over already read data */
}
}
printf("Received %ld characters\n", total_read);
for (unsigned int i = 0; i < total_read; i++)
printf("Character #%d: '%c'\n", i, buffer[i]);
Помните, что это заблокирует вашу программу, пока все данные не будут прочитаны.Количество прочитанных символов может быть меньше всего, потому что может быть ошибка или пользователь нажал CTRL-D
(конец файла).
Также обратите внимание, что дескриптор файла STDIN_FILE, скорее всего, подключен кtty, что означает, что он может быть буферизован, поэтому не возвращает данные до новой строки, и вам, возможно, придется отключить буферизацию tty.
Edit Чтобы убедиться, что tty подключен к stdinнебуферизованный, используйте следующий код:
#include <termios.h>
/* ... */
/* Somewhere before reading from stdin... */
struct termios tty_settings;
tcgetattr(STDIN_FILENO, &tty_settings);
tty_settings.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &tty_settings);
Для получения дополнительной информации о функции tcsetattr
и флаге ICANON
проверьте страницу справочника для tcsetattr
.