首页 > 解决方案 > 如何创建(C)函数以使用“读取”将文件中的数据读取到链表中?

问题描述

我正在尝试创建一个函数,将给定文件中的所有字符读入链接列表,返回指向列表的指针。我不能使用 fopen、fread 或 fclose。如果对字符串进行操作,我已经确认这是工作代码:

请注意, ft_lstnew 创建了一个链接,其内容作为第一个 peram,返回指向该链接的指针。

head = ft_lstnew(&str[i++], 1);
curr = head;
while(str[i])
{
    curr->next = ft_lstnew(&str[i++], 1);
    curr = curr->next;
}
curr->next = ft_lstnew(&str[i], 1);

如何使用 read 函数更改此代码以对文件中的字符而不是字符串中的字符进行操作?

我的尝试

t_list *ft_lstnew(void const *content, size_t content_size);

t_list *read_tetriminos(char *file)
{
    int fd;
    char c;
    t_list *curr;
    t_list *head;

    fd = open(file, O_RDONLY, 0);
    read(fd, &c, 1);
    head = ft_lstnew(&c, 1);
    curr = head;
    while(curr->content != EOF)
    {
        read(fd, &c, 1);
        curr->next = ft_lstnew(&c, 1);
        curr = curr->next;
    }
    close(fd);
    return(head);
}

标签: ciolinked-list

解决方案


您快到了。您做错的唯一一件事是假设到达文件末尾时read将在提供的缓冲区内写入。只是一个特殊值,由提供的更高级别函数使用,用于表示已到达对象的末尾。此外,不是一个,而是一个。在这里,您使用原始系统调用,例如and来完成您的任务,与这些无关。EOFEOFstdio.hFILEEOFcharintopenreadEOF

您可以查看手册页read以了解到达文件末尾时会发生什么:

ssize_t read(int fd, void *buf, size_t count);

read()尝试count从文件描述符读取最多字节到从fd 开始的缓冲区buf

在支持查找的文件上,读取操作从文件偏移量开始,文件偏移量增加读取的字节数。 如果文件偏移位于或超过文件末尾,则不读取任何字节,并read()返回零。

因此,您的程序可以这样重写(我还添加了一些错误检查):

t_list *read_tetriminos(char *file)
{
    int fd;
    ssize_t nread;
    char c;
    t_list *curr;
    t_list *head;

    fd = open(file, O_RDONLY);
    if (fd == -1) {
        // Open failed.
        return NULL;
    }

    nread = read(fd, &c, 1);
    if (nread == -1) {
        // Read error.
        return NULL;
    } else if (nread == 0) {
        // File is empty.
        return NULL;
    }

    head = ft_lstnew(&c, 1);
    curr = head;

    while (read(fd, &c, 1) == 1) // You can check for errors here too, this is just simplified.
    {
        curr->next = ft_lstnew(&c, 1);
        curr = curr->next;
    }

    close(fd);
    return head;
}

推荐阅读