在上一节,我们将链表写入了文件,共写入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);}
我们来运行程序验证
可以看出文件中的链表数据节点逐个被读取至内存中,并打印出来。由此可见,链表数据的建立、写入文件、读取文件是利用结构体指针实现,在文件中顺序写入并读取出来。