在上一节,我们将链表写入了文件,共写入5个节点的数据,小计80字节。在这一节,我们试着读取文件中的内容,看是否能展示至屏幕上。
//按块大小进行读取,定义头结点的大小
void readfromFile(const char *filename)
{
FILE *file=fopen(filename,"r");
if(!file)
{
perror ("Error opening the file.");
exit(-1);
}
Node *current;//因为链表头是空内容;
current=(Node *)malloc(sizeof(Node));//分配空间
printf("file is found\n");
printf("file name %s is found\n",filename);
fseek(file, 0L, SEEK_END); // 将文件指针移动到文件尾部
long filesize = ftell(file); // 获取文件指针相对于起始位置的偏移量
printf("当前预读取的文件大小为 %ld 字节\n", filesize);
//按块大小进行读取
fseek(file, 0L, SEEK_SET); // 将文件指针移回到文件头部
filesize = ftell(file); // 获取文件指针相对于起始位置的偏移量
printf("当前读取的文件位置为 %ld 字节\n", filesize);
while(!feof(file))
{
filesize = ftell(file); // 获取文件指针相对于起始位置的偏移量
printf("----------------------------------------------\n");
printf("读取前的文件位置为第 %ld 字节\n", filesize);
printf("读取的块大小为%d 字节\n", sizeof(Node));
printf("预计读取出块大小为%d 字节存入内存中的大小是%d\n", sizeof(Node),sizeof(*current));
printf("开始读取块,输出块中数据\n");
fread(current,sizeof(Node),1,file);
printf("当前块数据是:%d\n",current->data);
filesize = ftell(file); // 获取文件指针相对于起始位置的偏移量
printf("读取后的文件位置为第 %ld 字节\n", filesize);
}
fclose(file);
}
我们来运行程序验证
可以看出文件中的链表数据节点逐个被读取至内存中,并打印出来。由此可见,链表数据的建立、写入文件、读取文件是利用结构体指针实现,在文件中顺序写入并读取出来。