LINUX.ORG.RU

fgets с помощью read


0

0

Как считать строку из stdin в буффер? Я знаю только наиболее тупой способ - читать по байту и сравнивать его с '\n', но не будет ли это слишком медленным? Не существует ли способа лучше, например каким-нибудь образом читать большими блоками, а излишек "запихивать" обратно в поток?

Мой вариант:

char *readline() {
#define BUFSIZE 512
char *r = malloc (BUFSIZE);
size_t buf = 512;
size_t bread = 0;
size_t bnow = 0;
while (bnow = read (0, r + bread, buf - bread))
{
bread += bnow;
if (buf - bread < BUFSIZE / 2)
{
buf += BUFSIZE;
r = realloc (r, buf);
}
}
r[bread] = 0;
return r;
}

p.s. Можно использовать только системные вызовы. Использовать функции libc нельзя, за исключением функций управления памятью (malloc, free, realloc, strdup) и каких-нибудь совсем простых (strlen, memcpy, strdup, strchr, ...).

★★★

Забыл сказать, что в данном блоке допущена ошибка, он возвращает не одну строчку, а весь поток. Надо сделать так, чтобы возвращал только одну строчку из потока, при этом не выкидывая из него все остальные, давая возможность считать их следующими вызовами.

kmeaw ★★★
() автор топика

>Как считать строку из stdin в буффер? Я знаю только наиболее тупой способ - >читать по байту и сравнивать его с '\n', но не будет ли это слишком медленным?

не будет, если использовать что-нибудь типа fgetc, у stdio есть свой буфер,
ваш алгоритм будет понятным и не будет "бояться" длинных строк,
а за счет невидимого для вас буфера библиотеки stdio он будет и эффективным.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.