如何创建(C)函数以使用“读取”将文件中的数据读取到链接列表中?

Cli*_*tCC 5 c io linked-list

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

请注意,ft_lstnew创建一个以内容为第一个链接的链接,并返回指向该链接的指针。

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);
Run Code Online (Sandbox Code Playgroud)

如何使用读取功能更改此代码以对文件中的字符而不是字符串中的字符进行操作?

我的尝试

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);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*lli 1

你快到了。您做错的唯一一件事是假设当到达文件末尾时read将写入提供的缓冲区内。只是由 提供的更高级别函数使用的特殊值,用于表示已到达对象的末尾。此外,不是 a ,而是 a 。在这里,您使用原始系统调用(例如和 )来完成您的任务,与这些无关。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;
}
Run Code Online (Sandbox Code Playgroud)