gpt4 book ai didi

c - 使用 POSIX IO 原语逐行读取文件

转载 作者:行者123 更新时间:2023-11-30 15:21:55 25 4
gpt4 key购买 nike

我是一个新手,我正在尝试使用 POSIX IO 原语实现我自己的 readline()。

我已经写了代码:

int readline(int fd, char **line, size_t size)
{
char *ch = malloc(sizeof(char));
char buf[BUFSIZ];
int index = 0;
int nr;

if (NULL == line)
return -1;

do
{
nr = read(fd, ch, 1);

if (nr == -1)
{
perror("read()");
return -1;
} else
if (0 == nr)
break;

buf[index++] = (*ch);


} while ((*ch != '\n') && (index < BUFSIZ));

if ((index) && (buf[index-1] == '\r'))
{
index--;
}

buf[index++] = '\n';

buf[index] = 0; /* null-terminate */

printf("index = %d\n", index);

strncpy(*line, buf, size);

if ((buf[0] == '\n') || (buf[0] == '\0') || (buf[0] == '\r'))
return 0;
return index;
}

int main(void)
{
int fd;
ssize_t nbytes;

char *line = malloc(BUFSIZ*sizeof(char));

fd = open("/etc/passwd", O_RDONLY);

while((nbytes = readline(fd, &line, sizeof(line))) > 0)
{
write(1, line, nbytes);
}

close(fd);

return 0;
}

但它每行只读取 8 个字符。我花了很多时间来修复代码,但没有取得任何进展。我也在这个网站上阅读了很多主题,其中大多数都使用相同的算法,但只有我的代码不起作用!

最佳答案

问题是您使用 sizeof 运算符来获取分配内存的大小。 sizeof 运算符不会为您提供指针所指向内容的大小,而是为您提供实际指针的大小。

在您的例子中,它是 8 个字节,等于 64 位,这是 64 位系统上的标准指针大小。

您需要跟踪自己分配的大小,在本例中,将 BUFSIZ 作为参数传递。

关于c - 使用 POSIX IO 原语逐行读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29433334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com