#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct stu//结构体
{
char num[20];
char name[20];
struct stu * next;
}pstu,*st;
void write(pstu *head)//写入文件,写入文件不用返回值,只是让这个函数执行写入文件的过程,需要吧链表传进去
{
if(head==NULL || head->next==NULL)//判断链表是否为空
{
printf("error");
return ;
}
FILE * fp;//文件指针
fp=fopen("456.txt","a+");//打开文件 有时候单用w方式写入文件,会出现覆盖写的问题,,,所以用上了a+方式
if(fp==NULL)
{
printf("error");
return ;
}
printf("打开的文件\n");
int ret;
// st temp=head->next;
// while(head->next!=NULL)//保存进文件,知道链表全部遍历完
{//因为是只有一个结构体存入,所以没有用循环
ret=fwrite(head->next,sizeof(pstu),1,fp);//存
if(ret<0)
{
printf("error");
return ;
}
// head=head->next;
}
fclose(fp);//关闭文件
}
st read()//读文件
{
st head=(st)malloc(sizeof(pstu));//定义头节点
head->next=NULL;
st temp=(st)malloc(sizeof(pstu)); //
FILE *fp;
fp=fopen("456.txt","r");
if(fp==NULL)
{
printf("file empty\n");
return NULL;
}
while(fread(temp,sizeof(pstu),1,fp)>0)//把文件中的东西保存进以head为头节点的链表中
{
// head->next=temp->next;//问题出在这,导致一直读取文件失败
temp->next=head->next;//首先head->next里面是置空的
head->next=temp;
temp=NULL;
temp=(st)malloc(sizeof(pstu));
}
free(temp);
temp=NULL;
fclose(fp);
return head;//返回整个链表
}
void add()//为文件添加数据
{
// st head=(st)malloc(sizeof(pstu));定义的时候,需要置空,而不是分配空间
st head=NULL;
head=read();//首先读取文件,以链表形式赋值给head
if(head==NULL)
{
head=(st)malloc(sizeof(pstu));
head->next=NULL;
}
head->next=NULL;
st p=(st)malloc(sizeof(pstu));
printf("输入号码:");
scanf("%s",p->num);
printf("输入姓名:");
scanf("%s",p->name);
// head->next=p->next; 与上面同样的问题
p->next=head->next;
head->next=p;
write(head);
}
void show()//显示函数
{
st head=read();
if(head==NULL || head->next==NULL)
{
printf("the link is empty\n");
return;
}
while(head->next!=NULL)
{
printf("%s\t%s\n",head->next->num,head->next->name);
head=head->next;
}
}
int main()
{
// add();
show();
#include<string.h>
#include<stdlib.h>
typedef struct stu//结构体
{
char num[20];
char name[20];
struct stu * next;
}pstu,*st;
void write(pstu *head)//写入文件,写入文件不用返回值,只是让这个函数执行写入文件的过程,需要吧链表传进去
{
if(head==NULL || head->next==NULL)//判断链表是否为空
{
printf("error");
return ;
}
FILE * fp;//文件指针
fp=fopen("456.txt","a+");//打开文件 有时候单用w方式写入文件,会出现覆盖写的问题,,,所以用上了a+方式
if(fp==NULL)
{
printf("error");
return ;
}
printf("打开的文件\n");
int ret;
// st temp=head->next;
// while(head->next!=NULL)//保存进文件,知道链表全部遍历完
{//因为是只有一个结构体存入,所以没有用循环
ret=fwrite(head->next,sizeof(pstu),1,fp);//存
if(ret<0)
{
printf("error");
return ;
}
// head=head->next;
}
fclose(fp);//关闭文件
}
st read()//读文件
{
st head=(st)malloc(sizeof(pstu));//定义头节点
head->next=NULL;
st temp=(st)malloc(sizeof(pstu)); //
FILE *fp;
fp=fopen("456.txt","r");
if(fp==NULL)
{
printf("file empty\n");
return NULL;
}
while(fread(temp,sizeof(pstu),1,fp)>0)//把文件中的东西保存进以head为头节点的链表中
{
// head->next=temp->next;//问题出在这,导致一直读取文件失败
temp->next=head->next;//首先head->next里面是置空的
head->next=temp;
temp=NULL;
temp=(st)malloc(sizeof(pstu));
}
free(temp);
temp=NULL;
fclose(fp);
return head;//返回整个链表
}
void add()//为文件添加数据
{
// st head=(st)malloc(sizeof(pstu));定义的时候,需要置空,而不是分配空间
st head=NULL;
head=read();//首先读取文件,以链表形式赋值给head
if(head==NULL)
{
head=(st)malloc(sizeof(pstu));
head->next=NULL;
}
head->next=NULL;
st p=(st)malloc(sizeof(pstu));
printf("输入号码:");
scanf("%s",p->num);
printf("输入姓名:");
scanf("%s",p->name);
// head->next=p->next; 与上面同样的问题
p->next=head->next;
head->next=p;
write(head);
}
void show()//显示函数
{
st head=read();
if(head==NULL || head->next==NULL)
{
printf("the link is empty\n");
return;
}
while(head->next!=NULL)
{
printf("%s\t%s\n",head->next->num,head->next->name);
head=head->next;
}
}
int main()
{
// add();
show();
}
//刚开始出现问题,是显示不出来的问题,所以就在show()函数里面找问题,一直改,最后发现在读文件里面与写文件时犯同样的错-----无值赋有值(head->next=p->next; )