C语言文件输入和读取的一个问题

愤怒的小蚂蚁int_ant 2014-05-11 09:57:04
这个是我从输入端读取的数据并且把它写入文件的模块
void CreateNewFamliy()//    核       心        代          码        //
{
FILE *file = NULL;
mid *fp,*bt;
int rear=0,front=0,count=1;//前两个为栈的变量,第三个为计数变量//
char sex;
printf(" 名 字 输 入 N U L L 结 束 建 树 ! \n");
//摧毁原有数据//
file = fopen("data.txt","wb");
fclose(file);
//开始写入数据//
while(1)
{
bt = (mid *)malloc(sizeof(mid));
memset(bt,'\0',sizeof(mid));
printf("请输入家族第%d位成员的名字:",count);
fflush(stdin);//刷新缓冲区//
gets(name);
if(strcmp("null",name)==0) break;
else
{
strcpy(bt->Name,name);
printf("请输入家族第%d位成员的岁数:",count);
gets(bt->Old);
loop:printf("请输入家族第%d位成员的性别(f--女性,m--男性):",count);
sex=getch();
if(sex=='f'||sex=='F') printf("女性\n");
else if(sex=='m'||sex=='M')printf("男性\n");
else
{
printf("性别输入有误!\n");
goto loop;
}
bt->Sex=sex;
printf("请输入家族第%d位成员的配偶名字(若没有则输入 0):",count);
gets(bt->Match);
printf("请输入家族第%d位成员的出生日期(格式为xxxx-xx-xx):",count);
gets(bt->BornDay);//此处需要增强程序健壮性,当格式不正确的时候需要重新输入//
printf("请输入家族第%d位成员的死亡日期(格式与出生日期格式相同,若木有死亡请输入'0'):",count);
gets(bt->DiedDay);//没有死亡就为0//
file = fopen("data.txt","ab");
if(fwrite(bt,sizeof(mid),1,file)==1&&file != NULL) printf("数据写入成功!\n");
else
{
printf("数据写入失败!\n");
exit(0);
}
fclose(file);//到此为止,写入文件操作文成,下面进行数的建立操作//
free(bt);//释放掉bt指针的内存//
fflush(stdin);//刷新缓冲区//
count++;
}
}
printf("结束输入!\n");
printf("等待按下任意键返回!\n");
fclose(file);
getch();
printf("\n");
}
这个是我从文件中导入数据到树结构中的模块。

//将文件中的数据导入树结构中//
BTree * inputTree(BTree *root)// 核 心 代 码 //
{
FILE *file;
BTree *bt,*fp;
mid *mdp;
int rear=1,front=1,age=1,flag=0;
file = fopen("data.txt","rb") ;
if(file != NULL)
{
while(!feof(file))//return -1 while to the file end!//
{
mdp = (mid *)malloc(sizeof(mid));
bt = (BTree *)malloc(sizeof(BTree));
memset(bt,'\0',sizeof(BTree));//初始化结构体,避免输出乱码//
if(fread(mdp,sizeof(mid),1,file)==1)
{
//进行数据拷贝//
strcpy(bt->Name,mdp->Name);
strcpy(bt->Old,mdp->Old);
bt->Sex=mdp->Sex;
strcpy(bt->Match,mdp->Match);
strcpy(bt->BornDay,mdp->BornDay);
strcpy(bt->DiedDay,mdp->DiedDay);
bt->Age=age;//年代信息与后变量相同//
flag=1;
}
bt->lchild=NULL;
bt->rchild=NULL;
Tstack[rear]=bt;
rear++;
if(rear==2)
{
root=bt;
age++;
}
else
{
if(Tstack[front]->lchild == NULL)//&&flag==1
{
bt->parent=Tstack[front];//指向父节点//
Tstack[front]->lchild=bt;
}
else if(Tstack[front]->rchild == NULL)
{
bt->parent=Tstack[front];
Tstack[front]->rchild=bt;
}
else if(Tstack[front]->rchild && Tstack[front]->lchild)
{
front++;
//printf("%d",(int)(pow(2,age)+0.5));
if(front==(int)(pow(2,age)+0.5)) age++;//代计算//
}
}
flag=0;//初始化检测值,用来检测是否拷贝了有效数据//
}
fclose(file);
printf("\n读取成功!\n");
}
else
{
printf("file error!\n");
exit(0);
}
return root;
}


问题:为什么会出现如图片上的 多输出了一行??这一行的数据是无效的! 而且,当我进行多个数据的输入的时候,总是最后一个数据的前一个数据为无效数据,也就是说 在构建树结构的时候,无效数据占了本来有效数据的位置。
我测试的结果是,输入文件的时候有问题,但是我用了很多办法都没解决,求大神~
...全文
123 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
没人愿意帮一下忙吗?

69,381

社区成员

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

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