(Я только уполномочен использовать: malloc, free, read)
Я пытаюсь получить следующую строку в файле с любым BUF_SIZE, но это возвращает мне неправильное значение. (Get_next_line проект в 42school/Epitech)
Таким образом, возвращается (неправильное значение, отсутствие первых символов) значение:C - Получить следующий проект линии
3
1 - #include <stdio.h>
1 - dlib.h>
1 - clude "libft/libft.h"
1 - BUFF_SIZE 32
Мой исходный код:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include "libft/libft.h"
# define BUFF_SIZE 32
int get_next_line(int const fd, char **line)
{
char buffer[BUFF_SIZE + 1];
size_t i;
size_t size;
if (!(*line = malloc(BUFF_SIZE)))
return (-1);
*line[0] = '\0';
while (read(fd, buffer, BUFF_SIZE) > 0)
{
buffer[BUFF_SIZE + 1] = '\0';
if (buffer[0] == '\n')
return (1);
if (ft_strchr(buffer, '\n') != NULL)
{
i = 0;
size = ft_strlen(*line);
buffer[BUFF_SIZE + 1] = '\0';
while (buffer[i] != '\0')
{
if (buffer[i] == '\n')
{
if (!(*line = realloc(*line, i + size)))
return (-1);
buffer[i] = '\0';
ft_strncat(*line, buffer, i);
return (1);
}
i++;
}
}
if (!(*line = realloc(*line, BUFF_SIZE)))
return (-1);
ft_strncat(*line, buffer, BUFF_SIZE);
}
return (0);
}
int main(void)
{
int fd;
int ret;
char *line;
if ((fd = open("main.c", O_RDONLY)) < 3 && fd != 0)
return (-1);
printf("%d\n", fd);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
ret = get_next_line(fd, &line);
printf("%d - %s\n", ret, line);
return (0);
}
Почему не возвращает мне первый четыре строки правильно?
'while (read (fd, buffer, BUFF_SIZE)> 0)' не читает строки: он читает 32 символа. Это не функция чтения текста, она просто читает длину, о которой вы говорите. Поэтому, когда вы переходите к следующей строке, часть ее уже была прочитана. –
'buffer [BUFF_SIZE + 1] = '\ 0';' неверно: он пишет за пределами массива (потому что массив начинается с 0). Используйте: 'buffer [BUFF_SIZE] = '\ 0';' –
Возможный дубликат [C - Прочитать файл по строкам] (http://stackoverflow.com/questions/35366791/c-read-a-file-line -по-линия) – Romain