之前的那个demo没有添加本地文件读写功能,所以每次都比较麻烦,要输入很多东西,才能看到系统的真面目,所以,今天改进了一下,可以读取本地文件,每次操作后都会保存到文件中,以免发生bug导致数据丢失,没有文件的话,会自动新建,然后会提示添加相关数据,然后会自动保存到文件
这个完全是用字符串存储的,而年龄的话是int,所以中间会由字符串转int,int转字符串的情况
还有就是分割和组合字符串,写到文件中以空格分开,而读取到结构体中需要用空格拆分,然后在分别写入
写入文件也是一样,从结构体重拿出相应数据,后边追加空格,来达到相应的效果
图就不贴了,和上次的一样,想看的话,点我
直接刚demo
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
typedef struct studentInfor
{
char name[20];
int age;
char address[50];
char phoneNumber[11];
struct studentInfor *next;
}SI;
void saveData(SI *listHead,const char *path)
{
FILE *fp=fopen(path,"r+");
SI *p=listHead;
int i=1;
printf("\n\n");
while(p->next!=NULL)
{
p=p->next;
char *str1=(char *)malloc(sizeof(char));
char *str2=(char *)malloc(sizeof(char));
char *str3=(char *)malloc(sizeof(char));
char *str4=(char *)malloc(sizeof(char));
strcpy(str1,p->name);
sprintf(str2,"%d" ,p->age);
strcpy(str3,p->address);
strcpy(str4,p->phoneNumber);
strcat(str1 , " ");
strcat(str2 , " ");
strcat(str3 , " ");
if(p->next!=NULL)
strcat(str4 , "\n");
strcat(str1,str2);
strcat(str1,str3);
strcat(str1,str4);
if(fputs(str1,fp))
{
printf("第%d条数据保存成功\n",i++);
}
}
fclose(fp);
}
void printfInfor(SI * listHead)
{
SI *p=listHead;
printf("~~~~~~~~~~~~~~~~~~~~~~~~~信息列表~~~~~~~~~~~~~~~~~~~~~~\n");
printf("姓名 年龄 地址 联系方式\n");
while(p->next!=NULL)
{
p=p->next;
printf("%-20s%-10d%-60s%-11s\n",p->name,p->age,p->address,p->phoneNumber);
}
}
SI* inputInfor()
{
SI *node=(SI *) malloc ( sizeof(SI) );
char name[20];
char address[50];
char phoneNumber[11];
int age=0;
if( node != NULL)
{
while(1)
{
printf("请输入姓名,20位以内\n");
scanf("%s",name);
getchar();
if(strlen(name)<20)
{
strcpy( node->name , name);
break;
}else
printf("输入的位数不符合要求");
}
while(1)
{
printf("请输入地址,50位以内\n");
scanf("%s",address);
getchar();
if(strlen(address)<50)
{
strcpy( node->address , address);
break;
}else
printf("输入的位数不符合要求");
}
while(1)
{
printf("请输入电话号码,11位\n");
scanf("%s",phoneNumber);
getchar();
if(strlen(phoneNumber)<11)
{
strcpy( node->phoneNumber , phoneNumber);
break;
}else
printf("输入的位数不符合要求");
}
printf("请输入年龄\n");
scanf("%d",&age);
getchar();
if(age>150)
{
printf("年龄太大,不符合要求\n");
}
node->age=age;
node->next=NULL;
}
return node;
}
void addInfor(SI *listHead)
{
SI *p=listHead;
SI *newNode=(SI *)malloc(sizeof(SI));
newNode=inputInfor();
while(p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
p->next=newNode;
newNode->next=NULL;
free(newNode);
}
int searchInfor(SI *listHead , char *name,int isDel,int isModify)
{
SI *p=listHead;
SI *q;
while(p->next!=NULL)
{
q=p;
p=p->next;
if(strcmp(p->name,name)==0)
{
printf("找到相应联系人\n\n");
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
if(isModify == 1)
{
SI *modify=(SI *)malloc(sizeof(SI));
modify=inputInfor();
strcpy(p->name,modify->name);
strcpy(p->address,modify->address);
strcpy(p->phoneNumber,modify->phoneNumber);
p->age=modify->age;
printf("修改为\n");
free(modify);
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
return 1;
}
if(isDel==1)
{
printf("是否真的要删除这条信息[Y/N]");
char a;
scanf("%c",&a);
getchar();
if(a=='Y')
{
q->next=p->next;
p=q->next;
return 1;
}
}
return 1;
}
}
if(p->next==NULL)
{
if(strcmp(p->name,name)==0)
{
printf("找到相应联系人\n\n");
printf("%s,%d,%s,%s\n",p->name,p->age,p->address,p->phoneNumber);
if(isModify == 1)
{
SI *modify1=(SI *)malloc(sizeof(SI));
modify1=inputInfor();
strcpy(p->name,modify1->name);
strcpy(p->address,modify1->address);
strcpy(p->phoneNumber,modify1->phoneNumber);
p->age=modify1->age;
free(modify1);
p->next=NULL;
return 1;
}
if(isDel==1)
{
printf("是否真的要删除这条信息[Y/N]");
char a;
scanf("%c",&a);
getchar();
if(a=='Y')
{
q->next=NULL;
return 1;
}
}
return 1;
}
}
return -1;
}
FILE* readToList(SI *listHead, FILE *fp)
{
SI *p=listHead;
char a[100];
fgets(a,100,fp);
SI *newNode=(SI *)malloc(sizeof(SI));
int len=0;
a[strlen(a)-1]='\0';
char *token = strtok(a ," ");
while(token!=NULL && len < 4 )
{
switch (len)
{
case 0: strcpy(newNode->name,token);
break;
case 1: newNode->age=atoi(token);
break;
case 2: strcpy(newNode->address,token);
break;
case 3: strcpy(newNode->phoneNumber,token);
break;
}
len++;
token=strtok(NULL," ");
}
while(p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
{
newNode->next=NULL;
}
p->next=newNode;
p=p->next;
return fp;
}
int main(int argc,const char *argv[])
{
SI *list=(SI *)malloc(sizeof(SI));
if(list == NULL)
{
return 0;
}
char name[20];
char read[100];
list->next=NULL;
if(argc ==1)
{
printf("请输入文件路径\n");
return 0;
}
FILE *fp=fopen(argv[1],"w+");
if(fp)
{
if(fscanf(fp,"%c",read)==EOF)
{
rewind(fp);
printf("该文件为空,为使系统正常工作,请先添加4个人员\n");
addInfor(list);
addInfor(list);
addInfor(list);
addInfor(list);
}
while(feof(fp)==0)
{
fp=readToList(list,fp);
}
printfInfor(list);
while(1)
{
printf("\n\n");
printf("***********************************************************\n");
printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
printf("菜单列表:\n");
printf("1:添加信息\n");
printf("2:修改信息\n");
printf("3:删除信息\n");
printf("4:查询信息\n");
printf("5:退出\n");
printf(">>>>>>>>>>>>>>小型学生管理系统>>>>>>>>>>>>>>>\n");
printf("***********************************************************\n\n");
printf("请输入选项:\n");
int a=0;
scanf("%d",&a);
getchar();
switch(a)
{
case 1:
addInfor(list);
printf("数据添加成功\n");
saveData(list,argv[1]);
printfInfor(list);
break;
case 2:
printf("请输入要修改的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,0,1)==-1)
{
printf("没有相关人员,请确认后在修改\n");
}
printf("数据修改成功\n");
saveData(list,argv[1]);
printfInfor(list);
break;
case 3:
printf("请输入要删除的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,1,0)==-1)
{
printf("没有相关信息,无法删除\n");
}
printf("数据删除成功\n");
saveData(list,argv[1]);
printfInfor(list);
break;
case 4:
printf("请输入要查找的名字:");
scanf("%s",name);
getchar();
if(searchInfor(list,name,0,0)==-1)
{
printf("没有找到相关人员,请确认后查找\n");
}
saveData(list,argv[1]);
printfInfor(list);
break;
case 5:
return 0;
break;
}
}
}
return 0;
}