想通过链表从文件中读取,之后复制到新文件中,但是程序一闪就退,也无法新建文件

[复制链接]
查看11 | 回复2 | 2021-1-27 05:27:06 | 显示全部楼层 |阅读模式
#include
#include
#include
#include
#include
structusersdata//建立链表节点
{
charname[20];
charpassword[20];
structusersdata*pnext;
};
typedefstructusersdatausers;//结构体名称更改
intlist_number_count;
users*file_read_listnode()//从文件中读取到链表中
{
users*pHead=NULL;//设置头指针为空指针不指向任意节点
users*pEnd,*pNew;//建立两个临时指针,一个为下一节点的节点,另一个为节点的最后一个节点
intlist_number_count=0;//用于判断接节点数是否只有一个
pEnd=pNew=(users*)malloc(sizeof(users));//为末节点和新接待开辟空间
FILE*fl;
fl=fopen("users.txt","r");//以只读形式打开文件
printf("test\n");
if(fl==NULL)//判断文件指针指向位置是否为空,为空则报错文件不存在
{
printf("无法读取或写入文件\n");
exit(-2);
}
while(1)//开始循环建立节点
{
printf("test\n");
list_number_count++;
if(list_number_count==1)//判断是否为第一个节点
{
pNew->pnext=NULL;//建立第一个节点
fscanf(fl,"%s%s",pNew->name,pNew->password);//读入数据到第一个节点
pEnd=pNew;//尾节点为新节点
pHead=pNew;//更新头指针为指向新节点
}
else//不是第一个节点
{
if(!feof(fl))//判断文件是否读写完成,完成返回-1(即不读完文件执行)
{
fscanf(fl,"%s%s",pNew->name,pNew->password);//从文件中读入数据
pEnd->pnext=pNew;//节点指针指向下一节点
pNew->pnext=NULL;//新节点的指针指向空
pEnd=pNew;//更新尾节点位置
pNew=(users*)malloc(sizeof(users));//为下一个新节点开一个新的空间
}
else
free(pNew);//文件读写完成后返回头节点指针
fclose(fl);
returnpHead;
}
}
}
voidwrite_Out(users*pHead)//从链表写入文件
{
users*ptemp;//定义一个临时存放头指针值的指针
FILE*fl;
fl=fopen("userscopy.text","w+");
printf("正在从程序输出信息......\n");
Sleep(1000);
ptemp=pHead->pnext;//让临时指针判断原来头指针中是否为没有节点(头节点为自定义仅用于访问使用,没有值)
if(ptemp==NULL)
return;//没有节点返回函数
while(ptemp!=NULL)//移动到最后链表节点指针是不是空的,空的就不必在写入文件跳出循环
{
fprintf(fl,"%s\t%s\n",ptemp->name,ptemp->password);//将链表信息写入文件
ptemp=ptemp->pnext;//更新指针位置
}
fclose(fl);
return;
}
intmain()
{
users*pHead;
printf("正在复制请稍后....\n");
pHead=file_read_listnode();
//write_Out(pHead);
printf("写入完成");
Sleep(10000);
return0;
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:06 | 显示全部楼层
if(!feof(fl)){//进入这个if时
pNew=(users*)malloc();//首先要做这一步
...
}
为什么?
你好好想想,进入if(list_number_count==1)是就已经把pNew用了,进入else是不是应该重新给pNew分配内存?什么时候分配,那就是在你的if(!feof(fl))判断文件没有eof的时候分配。
另外,returnpHead也最好放在最外面,否则文件不能正常读入时没有返回值,函数没有返回值是危险行为。

回复

使用道具 举报

千问 | 2021-1-27 05:27:06 | 显示全部楼层
谢谢了,我找到这个问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行