关于fopen打开或创建文件,指针总是指向空值的问题

qq_33357956 2017-12-11 09:00:15
我做的是磁盘B+树,创建文件代码如下
Debug了几天也解决不了,不知道到底哪出问题了

int createIndexBPTree(char *FileName, char *attr)//创建B+树,并进行相应的初始化,indexBPTree是一个全局变量。
{
P_BPNode root;
indexBPTree.root = (P_BPNode)malloc(sizeof(BPNode));
memset(indexBPTree.root, 0, sizeof(BPNode));
indexBPTree.num = 1;//记录根有多少个节点
indexBPTree.start = 1;//最小的数据所在的叶节点
strcat_s(indexBPTree.name, FileName);
strcat_s(indexBPTree.name, ".");
strcat_s(indexBPTree.name, attr);
puts(indexBPTree.name);
root = indexBPTree.root;
//printf("%s\n",root);
root->size = 0;//记录这个节点有多少个关键字
root->leaf = 1;//判断是否为页节点
root->next = -1;
root->pid = 1;//记录这个节点在文件的中的编号
indexBPTree.locate = 1;//记录根节点的在文件中的标号,即 pid

//indexBPTree.fp = fopen(indexBPTree.name, "wb");
errno_t err;
err = fopen_s(&indexBPTree.fp, indexBPTree.name, "wb");
if (err != 0)
puts("FILE CREATE FAIL!!!");
else {
fwrite(&indexBPTree.num, sizeof(int), 1, indexBPTree.fp);
fwrite(&indexBPTree.locate, sizeof(int), 1, indexBPTree.fp);
writeNode(root);
fclose(indexBPTree.fp);
}
free(root);
indexBPTree.root = NULL;
return 0;
}

int initIndexBPTree(char *FileName, char *attr)//初始化BPTree,打开相应文件, fp记录;为 root分配内存可以存储一个节点的内存,并读入根节点
{
indexBPTree.root = (P_BPNode)malloc(sizeof(BPNode));
memset(indexBPTree.root, 0, sizeof(BPNode));
indexBPTree.start = 1;//最小的数据所在的叶节点
strcat_s(indexBPTree.name, FileName);
strcat_s(indexBPTree.name, ".");
strcat_s(indexBPTree.name, attr);
errno_t err;
err = fopen_s(&indexBPTree.fp, indexBPTree.name, "rb+");
if (err != 0)
puts("FILE OPEN FAIL!!!");//结果总是输出这个,很头疼
//indexBPTree.fp = fopen(indexBPTree.name, "rb+");
else {
fread(&indexBPTree.num, sizeof(int), 1, indexBPTree.fp);//没有if else的话断点在这个位置,fp是空值
fread(&indexBPTree.locate, sizeof(int), 1, indexBPTree.fp);
readNode(indexBPTree.root, indexBPTree.locate);
}
return 0;
}
望论坛大神们帮忙解决一下!
感谢!!!
...全文
821 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33357956 2017-12-12
  • 打赏
  • 举报
回复
断言错误: Expression: (fh >= 0 && (unsigned)fh < (unsigned)_nhandle)
qq_33357956 2017-12-12
  • 打赏
  • 举报
回复
定位在当前位置之后还是中断在同一位置呀,不是这个地方的问题
自信男孩 2017-12-12
  • 打赏
  • 举报
回复
引用 2 楼 qq_33357956 的回复:
fopen 的问题已经解决了 我先创建再初始化就不会有空值了 现在插入节点的时候出问题了: fwrite(w, sizeof(BPNode), 1, indexBPTree.fp);这个地方中断了。。。 相关函数: while (i >= 0 && s->key[i] > k) { s->key[i + 1] = s->key[i]; s->child[i + 1] = s->child[i]; i--; } s->key[i + 1] = k; s->child[i + 1] = pid; s->size++; writeNode(s); int writeNode(P_BPNode w) { fseek(indexBPTree.fp, sizeof(BPNode)*(w->pid - 1) + 2 * sizeof(int), SEEK_SET); fwrite(w, sizeof(BPNode), 1, indexBPTree.fp); return 0; } 能帮忙看一下吗
提供的信息太少,不知道你的数据结构和设计思想无从下手。
qq_33357956 2017-12-12
  • 打赏
  • 举报
回复
无语了,,,我把初始化节点的fclose注释了就没有问题了。。。 我到底在干些什么
qq_33357956 2017-12-12
  • 打赏
  • 举报
回复

还是找不到原因

这个到底是什么引起的啊啊啊
赵4老师 2017-12-12
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
qq_33357956 2017-12-12
  • 打赏
  • 举报
回复

qq_33357956 2017-12-12
  • 打赏
  • 举报
回复
typedef struct BPNode { unsigned int pid;//记录这个节点在文件的中的编号 unsigned int size; //记录这个节点有多少个关键字 int leaf; //判断是否为页节点 KeyType key[2 * T];//关键字(及对应每个孩子节点的中关键字最小的关键字) Pointer child[2 * T];// 指针,记录每个孩子在文件的第几个位置 Pointer next;//指针,记录下一个兄弟 }BPNode, *P_BPNode; //树的结构体 typedef struct BPTree { P_BPNode root; unsigned int locate;//记录根节点的在文件中的标号,即 pid unsigned int num; //记录根有多少个节点 char name[100]; //用于存储 B+树的节点文件的名字 FILE *fp; //打开写入name文件时,使用 int start; //最小的数据所在的叶节点 }BPTree, *P_BPTree; 磁盘B+树,先创建索引文件再进行插入操作
wodexiaojidan 2017-12-11
  • 打赏
  • 举报
回复
用SEEK_CUR, 你这么瞎搞,能不溢出崩了吗
qq_33357956 2017-12-11
  • 打赏
  • 举报
回复
fopen 的问题已经解决了 我先创建再初始化就不会有空值了 现在插入节点的时候出问题了: fwrite(w, sizeof(BPNode), 1, indexBPTree.fp);这个地方中断了。。。 相关函数: while (i >= 0 && s->key[i] > k) { s->key[i + 1] = s->key[i]; s->child[i + 1] = s->child[i]; i--; } s->key[i + 1] = k; s->child[i + 1] = pid; s->size++; writeNode(s); int writeNode(P_BPNode w) { fseek(indexBPTree.fp, sizeof(BPNode)*(w->pid - 1) + 2 * sizeof(int), SEEK_SET); fwrite(w, sizeof(BPNode), 1, indexBPTree.fp); return 0; } 能帮忙看一下吗
wodexiaojidan 2017-12-11
  • 打赏
  • 举报
回复
fopen()/fopen_s()和fclose()要记得配,打开之前一定记得fclose()

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧