(我只是被授权使用: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);
}
为什么它没有正确地返回前四行?
答案 0 :(得分:0)
由于read
只读取你告诉它的字节数(或者仍然要读取的数字,以较小者为准),你的策略是重复从文件读取到缓冲区并复制字符从缓冲区到行(每次读取时重新分配行),直到遇到新行。
在您的解决方案中,您测试缓冲区是否包含换行符,如果是,则处理缓冲区 - 但前几次读取可能不包含换行符。这就是为什么我反复说'#34;。
我希望这有助于你的家庭(我不会为你写解决方案)。
注意:看看如何终止缓冲区。它有一个错误。