2016-02-10 2 views
0

(Я только уполномочен использовать: 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); 
} 

Почему не возвращает мне первый четыре строки правильно?

+0

'while (read (fd, buffer, BUFF_SIZE)> 0)' не читает строки: он читает 32 символа. Это не функция чтения текста, она просто читает длину, о которой вы говорите. Поэтому, когда вы переходите к следующей строке, часть ее уже была прочитана. –

+0

'buffer [BUFF_SIZE + 1] = '\ 0';' неверно: он пишет за пределами массива (потому что массив начинается с 0). Используйте: 'buffer [BUFF_SIZE] = '\ 0';' –

+0

Возможный дубликат [C - Прочитать файл по строкам] (http://stackoverflow.com/questions/35366791/c-read-a-file-line -по-линия) – Romain

ответ

0

Как только read просто считывает количество байтов, которые вы ему указываете (или число, оставшееся до чтения, в зависимости от того, что меньше), ваша стратегия будет состоять в том, чтобы многократно читать из файла в буфер и копировать символы из буфера к строке (перераспределение строки с каждым чтением), пока вы не встретите новую строку.

В вашем решении вы проверяете, содержит ли буфер новый символ строки, и если да, обработайте буфер, но первые несколько строк могут не содержать новый символ строки. Вот почему я говорю «многократно».

Я надеюсь, что это поможет вашему домохозяйку (я не буду писать решение для вас).

Примечание: посмотрите, как вы завершаете буфер. У него есть ошибка.