大佬们好 本人纯新生正在做图书管理系统在b站上找了个视频学了下读和写入文档 写完之后发现可以存 但是读不出来 请大佬们看看哪里出了问题

第一次使用发帖功能,请大佬们包容下。后天就要就报告了,我感觉快急哭了。。
我的问题是出在读写数据这个函数,存入的数据读不回来。下面是我的代码
代码只选了有关部分的代码,case里面可用的功能只有 1,7,9,0。其他不必要的就没放上来。

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct BOOKD//创建结构体 
{
    char arrbookname[20];//书名
    char arrbookplace[20];//书架序号
    char  ibookplace[20];//书架的层数
    char cunfang[20];//这本书的状态 借处或者存入
    struct BOOKD* pNext;
}BOOKd;

BOOKd* g_jiegouhead = NULL;//我创建的链表头

BOOKd* g_jiegouend = NULL;//链表尾

void addbook(char arrbookname[20], char arrbookplace[20], char ibookplace[20], char cunfang[20])//这个函数是录入书本
{
    if (arrbookname == NULL || arrbookplace == NULL || ibookplace == NULL || cunfang == NULL)
    {
        printf("书本信息输入有误!");
        return;
    }
    BOOKd* jiegoujiedian = (BOOKd*)malloc(sizeof(BOOKd));
    strcpy(jiegoujiedian->arrbookplace, arrbookplace);
    strcpy(jiegoujiedian->arrbookname, arrbookname);
    strcpy(jiegoujiedian->ibookplace, ibookplace);
    strcpy(jiegoujiedian->cunfang, cunfang);
    jiegoujiedian->pNext = NULL;
    if (g_jiegouhead == NULL)
    {
        g_jiegouhead = jiegoujiedian;
        g_jiegouend = jiegoujiedian;
    }
    else {
        g_jiegouend->pNext = jiegoujiedian;
        g_jiegouend = jiegoujiedian;
    }
}

void qingkonglianbiao()
{
    char* pNext = NULL;
    BOOKd* jiegoujiedian = g_jiegouhead;
    while (g_jiegouhead != NULL)
    {
        g_jiegouhead = g_jiegouhead->pNext;
        free(pNext);

    }
}

void dayinshuju()//这个函数用来打印已经存入的数据
{
    BOOKd* jiegoujiedian = g_jiegouhead;

    while (jiegoujiedian != NULL)
    {
        printf("书名:%s ,书架序号:%s,层数:%s,书本状态:%s\n",
            jiegoujiedian->arrbookname,
            jiegoujiedian->arrbookplace,
            jiegoujiedian->ibookplace,
            jiegoujiedian->cunfang);

        jiegoujiedian = jiegoujiedian->pNext;

    }

}

void savedata()//数据存入文件
{
    BOOKd* jiegoujiedian = g_jiegouhead;
    FILE* pFile = NULL;
    char quanbu[1000] = { 0 };//存入用的字符串
    pFile = fopen("bok.bok", "wb+");
    if (NULL == g_jiegouhead)
    {
        printf("没有要保存的信息!\n");
        return;

    }
    if (NULL == pFile)
    {
        printf("文件打开失败!\n");
        return;

    }
    while (jiegoujiedian)//把书本信息统一到一个字符串里面
    {
        strcpy(quanbu, jiegoujiedian->arrbookname);
        strcat(quanbu, ".");
        strcat(quanbu, jiegoujiedian->arrbookplace);
        strcat(quanbu, ".");
        strcat(quanbu,jiegoujiedian->ibookplace);
        strcat(quanbu, ".");
        strcat(quanbu, jiegoujiedian->cunfang);

        fwrite(quanbu, 1, strlen(quanbu), pFile);//这里把字符串存进去
        fwrite("\r\n", 1, strlen("\r\n"), pFile);

        jiegoujiedian = jiegoujiedian->pNext;

    }
    fclose(pFile);

}
void readdata()
{
    FILE* pFile = fopen("bok.bok", "rb+");
    char arrbookname[20] = { 0 };//这几个数组用来接收文件的数据
    char arrbookplace[20] = { 0 };
    char ibookplace[20] = { 0 };
    char cunfang[20] = { 0 };
    char total[1000] = { 0 };
    int pnode = 0;//中间变量 用来表示存到了第几个数据
    int j = 0;//中间变量,让数组从[0]开始接收
    if (NULL == pFile)
    {
        printf("没有保存的信息!\n");
        return;

    }
    while (NULL != fgets(total, 1000, pFile))
    {
        int i = 0;
        pnode = 0;
        j = 0;

        for (i = 0; total[i] != '\r'; i++);
        {

            if (0 == pnode)//第一种数据
            {
                arrbookname[i] = total[i];
                if (total[i] == '.') { arrbookname[i] = '\0'; pnode++; }//我在前面存入数据在不同意义的数据中间打了点,所以我想通过点来隔开,一一对应读出
            }
            else if (1 == pnode)//第二种数据
            {

                arrbookplace[j] = total[i];
                j++;
                if (total[i] == '.') { arrbookplace[j] = '\0'; pnode++; j = 0; }

            }
            else if (2 == pnode)//第三种
            {

                ibookplace[j] = total[i];
                j++;
                if (total[i] == '.') { ibookplace[j] = '\0'; pnode++; j = 0; }
                ;
            }
            else//第四种
            {

                cunfang[j] = total[i];
                j++;
            }
        }
        addbook(arrbookname, arrbookplace, ibookplace, cunfang);//用前面写的录入函数把刚刚接收了数据的数据放进去,就把存的数据读写回来了
    }

    fclose(pFile);
}

int main()


{
    char arrbookname[20] = { 0 };

    char arrbookplace[20] = { 0 };
    char  ibookplace[20] = { 0 };
    char cunfang[20] = { 0 };
    int zhiling = -1;

    int biaoji = 1;
    printf("***********************图书管理系统***********************\n");
    printf("**********************本系统功能如下**********************\n");
    printf("*********             1.录入书籍(尾录入)           *****\n");
    printf("*********             2.录入书籍(头录入)             *****\n");
    printf("*********             3.在已有书籍的书架存放书籍     *****\n");
    printf("*********             4.查找指定书籍的信息           *****\n");
    printf("*********             5.登记借书&修改指定书籍的信息  *****\n");
    printf("*********             6.删除指定书籍的信息           *****\n");
    printf("*********             7.保存当前已记录的信息         *****\n");
    printf("*********             9.显示书库里的书籍             *****\n");
    printf("*********             0.退出系统                     *****\n");

    readdata();//这里直接执行读写函数

    while (biaoji)
    {
        printf("请根据序号以输入指令(输入12以查看功能目录)");
        scanf("%d", &zhiling);
        switch (zhiling)
        {
            {case 1:
                printf("请输入书本名字: ");
                scanf("%s", arrbookname, 20);

                printf("请输入要存放在第几号书架: ");
                scanf("%s", arrbookplace, 20);

                printf("请输入要存放至书架的第几层: ");
                scanf("%s", &ibookplace, 20);
                printf("请填写书籍状态为已存入:");
                scanf("%s", cunfang, 20);

                addbook(arrbookname, arrbookplace, ibookplace, cunfang);
                break; }


            {case 7:

                savedata();
                break;

            }

            {case 9:

            dayinshuju();
            break; }
            {case 0:

                biaoji = 0;
                break; }

            {default:
                printf("输入的指令有误\n"); break; }


            }

        }
    }

        system("pause");
        return 0;


}

图片说明
这里是执行1功能存入两本书 ,然后7保存。
图片说明
文档里面存入成功了
但是重新打开程序,执行9显示书库
图片说明
没有显示任何东西,我感觉就是没接收到,然后这里再点个保存之后,打开文件
图片说明
把空的东西存了进去,所以只有点点点。
实在不明白自己逻辑哪里出了错误,希望大佬们指点可以详细一点,因为真的很多东西不懂,查资料不太清楚往哪个方向查,哪些资料有用,排版乱乱的,大佬们海涵。

逻辑还是挺清晰的,读取不出来是因为你 void readdata() 函数中的 for循环后面多了个分号

    for (i = 0; total[i] != '\r'; i++);     //此处多了个分号

你去掉这个分号重新试试.