Я уже закодировал аналогичную функцию, это вызов get_next_line, и при каждом вызове он возвращает строку в текущую строку. Но я нашел кого-то, кто сделал это на удивление легко и не мог полностью понять его код. Мне хотелось бы помочь вам, ребята.Я не понимаю логики этого кода
char *get_next_line(const int fd)
{
static int last = 1;
static int rd = 0;
static int i = 0;
static char *res = NULL;
static char buff[READ_MAX];
if (buff[my_length(buff) - rd] == '\0')
{
if ((rd = read(fd, buff, READ_MAX)) <= 0)
return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
buff[rd] = '\0';
}
if ((res = (i == 0) ? malloc(sizeof(*res) * READ_MAX + 1) :
my_realloc(res, sizeof(*res) * READ_MAX + 1)) == NULL)
return (NULL);
while (buff[my_length(buff) - rd] && buff[my_length(buff) - rd] != '\n')
res[i++] = buff[my_length(buff) - rd--];
res[i] = '\0';
if (buff[my_length(buff) - rd] == '\n')
{
i = 0;
rd--;
return (res);
}
return (get_next_line(fd));
}
Например, я не понимаю:
return (res = (last-- && buff[my_length(buff) - rd - 1] != 10) ? res : NULL);
Что делает? " и «:» означает? Означает ли это, что условие до '?' return res или NULL?
Это довольно большой вопрос, но спасибо за вашу помощь в любом случае.
PS: Значение READ_MAX равно 5 в файле заголовка.
Звучит разумно. Я тоже этого не понимаю, это оружие. –
Я бы не сказал «на удивление легко», его очень трудно прочитать, полностью раскоментировано, а структура кода почти полностью скрыта. Попытайтесь начать с этого кода, а затем немного упростите его, выполнив только одну операцию на строку кода. Надеюсь, структура выскочит. – Gauthier
Функция 'my_length()' вызывается слишком часто, ИМХО. Что оно делает ? – wildplasser