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

我正在尝试创建一个函数,该函数将给定文件中的所有字符读入链接列表,并返回指向列表的指针。我不能使用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);

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

我的尝试

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,1);
        curr->next = ft_lstnew(&c,1);
        curr = curr->next;
    }
    close(fd);
    return(head);
}
jzq871001 回答:如何创建(C)函数以使用“读取”将文件中的数据读取到链接列表中?

您快到了。您唯一做错的事情是假设read将在到达文件末尾时将EOF写入提供的缓冲区中。 EOF只是stdio.h提供的高级功能使用的一个特殊值,表示已到达FILE对象的末尾。此外,EOF不是char,而是int。在这里,您使用openread之类的原始syscall来完成任务,而EOF与这些无关。

您可以查看manual page for 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,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;
}
本文链接:https://www.f2er.com/3028917.html

大家都在问