簡體   English   中英

如何創建 (C) 函數以使用“讀取”將文件中的數據讀取到鏈表中?

[英]How can I create a (C) function to read data from a file into a linked-list using 'read'?

我正在嘗試創建一個函數,該函數將給定文件中的所有字符讀入鏈表,並返回指向該列表的指針。 我無法使用 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);

我如何更改此代碼以使用讀取函數對文件中的字符而不是字符串中的字符進行操作?

我的嘗試

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);
}

您快到了。 您做錯的唯一一件事是假設read到達文件末尾時會將EOF寫入提供的緩沖區內。 EOF只是一個特殊值,由stdio.h提供的更高級別的函數用來表示已到達FILE對象的末尾。 此外, EOF不是char ,而是int 在這里,您使用原始系統調用(例如openread )來完成您的任務,而EOF與這些無關。

您可以查看read的手冊頁,了解到達文件末尾時會發生什么:

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

read()嘗試從文件描述符fd中讀取最多count個字節到從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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM