之前的那個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;
}