我是新手,我正在尝试使用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/

10-10 11:41