第一次使用发帖功能,请大佬们包容下。后天就要就报告了,我感觉快急哭了。。
我的问题是出在读写数据这个函数,存入的数据读不回来。下面是我的代码
代码只选了有关部分的代码,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++); //此处多了个分号
你去掉这个分号重新试试.