C - 获取下一个项目

时间:2016-02-10 09:52:13

标签: c file

(我只是被授权使用:malloc,免费,阅读)
我尝试使用任何BUF_SIZE获取文件中的下一行但是它返回了错误的值。 (42school / Epitech的get_next_line项目)
所以,返回(错误的值,缺少第一个字符)值:

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);
}

为什么它没有正确地返回前四行?

1 个答案:

答案 0 :(得分:0)

由于read只读取你告诉它的字节数(或者仍然要读取的数字,以较小者为准),你的策略是重复从文件读取到缓冲区并复制字符从缓冲区到行(每次读取时重新分配行),直到遇到新行。

在您的解决方案中,您测试缓冲区是否包含换行符,如果是,则处理缓冲区 - 但前几次读取可能不包含换行符。这就是为什么我反复说'#34;。

我希望这有助于你的家庭(我不会为你写解决方案)。

注意:看看如何终止缓冲区。它有一个错误。