[英]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
。 在這里,您使用原始系統調用(例如open
和read
)來完成您的任務,而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.