c - 如何创建(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);
}
解决方案
您快到了。您做错的唯一一件事是假设到达文件末尾时read
将在提供的缓冲区内写入。只是一个特殊值,由提供的更高级别函数使用,用于表示已到达对象的末尾。此外,不是一个,而是一个。在这里,您使用原始系统调用,例如and来完成您的任务,与这些无关。EOF
EOF
stdio.h
FILE
EOF
char
int
open
read
EOF
您可以查看手册页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;
}
推荐阅读
- python-3.x - GPhoto2 - 直接从相机获取焦距和传感器尺寸
- jenkins - 为什么 Jenkins 字符串参数为空?
- c# - 如何修复.Net核心中相同nuget包的多个版本的程序集绑定错误
- azure-functions - 在运行时 ~3 下无法在 Azure 函数上加载文件或程序集“Microsoft.Azure.WebJobs.EventHubs”
- java - Java:lambda 表达式连接多个字符串参数
- node.js - 当我控制台 req.body 它时,给我所有具有值的属性,但是当我获得单个属性值时,给我错误未定义
- javascript - TYPO3 在同一个容器中打开 actionlink
- javascript - 通过 ng-repeat 循环嵌套数组并创建表行
- sql - 使用 SQL 创建查询哪个网格位置在商店中产生最多收入
- python - 如何在 python 中绘制的图形中获得白色边框?