求助大佬帮忙修改代码,怎样将文件数据读入到链表,在第二次运行程序时不用手动输入直接读取显示

Hhq128 2018-03-07 10:19:07
#include<stdio.h>
//#include<dos.h>
#include<stdlib.h>
#include<string.h>
//#include<mem.h>
#include<ctype.h>
//#include<malloc.h>


typedef struct stu
{
char num[10];
char name[5];
char sex[2];
int age;
char addr[16];
char major[16];
char xb[16];
struct stu *next;
}STUDENT;

STUDENT*init(); //初始化函数 \/
int menu_select(); //菜单函数 \/
STUDENT*create(); //注册学生信息函数 \/
void search(STUDENT*head); //查询函数 \/
void printstu(STUDENT*head); //显示学生信息函数
void revise(STUDENT *head); //修改函数 \/
STUDENT*del(STUDENT*head); //删除函数 \/
void save(STUDENT *head); //保存文件函数 \/
STUDENT *read(STUDENT *head);//读取文件函数(读文件)

int main()
{
STUDENT *head;
head = init();

int nam,secret; /*登录操作使用的变量*/
printf("\n\n\n\n");
printf("\t------------------------学生学学籍管理系统------------------------\n");
printf("\n\n");
printf("\t\t\t\t账号:");
scanf("%d", &nam);
printf("\n");
printf("\t\t\t\t密码:");
scanf("%d", &secret);
//system("cls");

if(nam == 172021 && secret==172021)
{
printf("\n\n");
printf("\t\t\t\t登录成功!!!\n\n");

for(;;)
{
switch(menu_select())
{
case 1:
head = create();//注册
break;

case 2:
search(head);//查询
break;

case 3:
revise(head);//修改
break;
case 4:
head=del(head);//删除
break;
case 5:

printstu(read(head));//显示信息
break;
case 6:
exit(0);//退出系统
break;
default:
printf("输入错误");
break;

}
}
}
else
{
printf("输入错误,请重新登录");
}



}

STUDENT*init()//初始化函数操作
{
return NULL;
}



int menu_select()//菜单函数
{
int n;
//printf("\n按确定键进入菜单\n");
//getchar();
//system("cls");
printf("****************************欢迎使用学生学学籍管理系统***********************\n");
printf("\n");
printf(" ----------菜单--------- \n");
printf("\n\n");
printf("\t\t\t1.\t注册学生信息\n\n\t\t\t2.\t查询学生信息\n\n\t\t\t3.\t修改学生信息\n\n\t\t\t4.\t删除学生信息\n\n\t\t\t5.\t显示已存入学生信息\n\n\t\t\t6.\t退出系统\n\n");
do
{
printf("输入你的选择: ");
scanf("%d", &n);
} while(n<1||n>9);

return(n);

}

STUDENT *create()//创建链表,注册学生信息
{
char answer;
STUDENT *head=NULL;
STUDENT *p;
STUDENT *last=NULL;
//system("cls");
do
{
p = (STUDENT *)malloc(sizeof(STUDENT));
if (!p)
exit(0);
printf("\n\n");
printf("----------学生信息录入---------- \n");
printf("\n");
printf("------请输入:\n");
printf("\t学号:");
scanf("%s", p->num);
printf("\t姓名:");
scanf("%s", p->name);
printf("\t性别:");
scanf("%s", p->sex);
printf("\t年龄:");
scanf("%d", &p->age);
printf("\t户籍:");
scanf("%s", p->addr);
printf("\t专业:");
scanf("%s", p->major);
printf("\t系别:");
scanf("%s", p->xb);
printf("\n");
printf("\t是否继续录入?(Y or N): ");
getchar(); /* for '\n' */
scanf("%c", &answer);

if(last) {
last->next = p;
last = last->next;
} else {
last = p;
head = last;
}
} while(answer=='Y'||answer=='y');

//last->next =read(head);

save(head); /* store infor into file */
//read(head);
printf("\n");
printf("\t保存成功!!!\n\n");
return head;
}



void save(STUDENT *head)//保存文件函数(写文件)
{
FILE *fp;
STUDENT *p;
p=head;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("failed to open the file!!");
exit(1);
}
while(p!=NULL)
{
fprintf(fp,"%s %s %s %d %s %s %s \n",p->num,p->name,p->sex,p->age,p->addr,p->major,p->xb);
p=p->next;
}
fclose(fp);

}

STUDENT *read(STUDENT *head)//读取文件函数(读文件)
{
FILE *fp;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("failed to open the file!!");
return head;
}
STUDENT *new_1=(STUDENT *)malloc(sizeof(STUDENT));
STUDENT *head1=new_1;
while(!feof(fp))
{
STUDENT *q=(STUDENT *)malloc(sizeof(STUDENT));
fscanf(fp,"\n%s %s %s %d %s %s %s",q->num,q->name,q->sex,q->age,q->addr,q->major,q->xb);
new_1->next=q;
new_1=new_1->next;
}
new_1->next=NULL;
return head1;
fclose(fp);
}
\
/*FILE *fp;
STUDENT *p;
p=head;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("failed to open the file!!");
exit(1);
}
while(p!=NULL)
{
fscanf(fp,"\n%s %s %s %d %s %s %s",p->num,p->name,p->sex,p->age,p->addr,p->major,p->xb);
p=p->next;
}
fclose(fp);


}*/
void search(STUDENT *head)//搜素学生信息函数函数
{
STUDENT *p;
char s[5];//存放待搜索学生姓名
//system("cls");
printf("请输入要查找的学生姓名;");
scanf("%s", s);
p = head;
while (p && strcmp(p->name,s)) {
p = p->next;
}

if(p)
{
printf("已找到该学生信息!!!\n\n");
printf("----------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 户籍 | 专业 | 系别 |\n");
printf("-----------------------------------------------------------------\n");
printf(" %s %s %s %d %s %s %s",p->num,p->name,p->sex,p->age,p->addr,p->major,p->xb);
printf("\n");

}
else
{
printf("没有找到该学生");
}

}

STUDENT*del(STUDENT*head)//删除信息函数
{
if (!head)
return NULL;

STUDENT *p1,*p2;//p1为查找的需要删除节点,p2为其前驱指针
char c,s[6];
//system("cls");
printf("请输入要删除的学生学号;\n");
scanf("%s",s);
p1=p2=head;//将头指针分别赋给p1,p2

if (strcmp(head->num, s) == 0) {
printf("----------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 户籍 | 专业 | 系别 |\n");
printf("-----------------------------------------------------------------\n");
printf(" %s %s %s %d %s %s %s",p1->num,p1->name,p1->sex,p1->age,p1->addr,p1->major,p1->xb);
head = head->next;
printf("\n\n");
printf("已删除!!!\n\n");
return head;
}

while(p1 && strcmp(p1->name, s))
{
p2 = p1;
p1 = p1->next;
}
if (!p1) {
printf("没有这个学生的信息!!!\n\n");
return head;
}
if(strcmp(p1->name,s) == 0) //学号被找到
{
printf("----------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 户籍 | 专业 | 系别 |\n");
printf("-----------------------------------------------------------------\n");
printf(" %s %s %s %d %s %s %s",p1->num,p1->name,p1->sex,p1->age,p1->addr,p1->major,p1->xb);
printf("\n\n");

printf("是否要删除该学生,输入Y删除,输入N退出:");
getchar();
scanf("%c",&c);
if(c=='N'||c=='n')
printf("exit");
else
{
if(p1==head)//如果删除的是首节点
{
head=p1->next;
}
else
{
p2->next=p1->next;
free(p1);
}

printf("\n学号为;%s的学生信息已被删除",s);
return (head);

}

}

return head;
}

void revise(STUDENT *head)//修改函数
{
if (!head)
return;

int n;
STUDENT *p;
char s[5];//存放待搜索学生姓名
//system("cls");
printf("请输入要查找的学生姓名;");
scanf("%s", s);
p=head;
while(p && strcmp(p->name,s))
{
p = p->next;
}
if (!p) {
printf("没有找到该学生");
return;
}

if (p)
{
printf("已找到该学生信息!!!\n");
printf("----------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 户籍 | 专业 | 系别 |\n");
printf("-----------------------------------------------------------------\n");
printf(" %s %s %s %d %s %s %s",p->num,p->name,p->sex,p->age,p->addr,p->major,p->xb);
printf("\n\n");
printf("请选择您要修改的学生的信息内容:\n");
printf("+----------------------+\n");
printf("| 姓名 请按 1 |\n");
printf("| 专业 请按 2 |\n");
printf("| 户籍 请按 3 |\n");
printf("| 系别 请按 4 |\n");
printf("+----------------------+\n");
printf("请输入您的选择: ");
scanf("%d", &n);
printf("\n");
switch(n)
{
case 1:
printf("请输入新姓名");
scanf("%s",p->name);
break;
case 2:
printf("请输入新专业");
scanf("%s",p->major);
break;
case 3:
printf("请输入新户籍");
scanf("%s",p->addr);
break;
case 4:
printf("请输入新系别");
scanf("%s",p->xb);
break;
default:
printf("输入错误");
break;
}
printf("\n修改成功!!!\n");
}
}


void printstu(STUDENT*head)//显示学生信息函数
{
STUDENT *p;
printf("------------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | 户籍 | 专业 | 系别 |\n");
printf("------------------------------------------------------------------\n");
p=head;

while(p!=NULL)
{
printf(" %s %s %s %d %s %s %s",p->num,p->name,p->sex,p->age,p->addr,p->major,p->xb);
p=p->next;
printf("\n");
printf("\n");
}
printf("\n");
printf("显示完毕!!!\n\n");
}
...全文
336 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-03-08
  • 打赏
  • 举报
回复
STUDENT *read(STUDENT *head)//读取文件函数(读文件)
{
    int ret;
    FILE *fp;
    STUDENT *p, *prev;

    p = head;
    if ((fp = fopen("student.txt","r"))==NULL)
    {
        printf("failed to open the file!!");
        exit(1);
    }

    while (1)
    {
        p = (STUDENT *)malloc(sizeof(STUDENT));
        if (!p)
            exit(0);
        ret = fscanf(fp,"%s %s %s %d %s %s %s", p->num, p->name,p->sex, &p->age,p->addr,p->major,p->xb);
        if (ret < 7)
            break;
        if (!head) {
            head = p;
            prev = head;
        } else {
            prev->next = p;
            prev = p;
        }
    }
    free(p);
    prev->next = NULL;

    fclose(fp);

    return head;
}
STUDENT *create(STUDENT *head)//创建链表,注册学生信息
{
    char answer;
    STUDENT *p, *pcur;
    STUDENT *last = NULL;

    pcur = last = head;
    //system("cls");
    do
    {
        p = (STUDENT *)malloc(sizeof(STUDENT));
        if (!p)
            exit(0);
        printf("\n\n");
        printf("----------学生信息录入---------- \n");
        printf("\n");
        printf("------请输入:\n");
        printf("\t学号:");
        scanf("%s", p->num);
        printf("\t姓名:");
        scanf("%s", p->name);
        printf("\t性别:");
        scanf("%s", p->sex);
        printf("\t年龄:");
        scanf("%d", &p->age);
        printf("\t户籍:");
        scanf("%s", p->addr);
        printf("\t专业:");
        scanf("%s", p->major);
        printf("\t系别:");
        scanf("%s", p->xb);
        printf("\n");
        printf("\t是否继续录入?(Y or N):   ");
        getchar();   /* for '\n' */
        scanf("%c", &answer);

        while (pcur) {
            if (pcur->num == p->num) {
                free(p);
                continue;
            }
            last = pcur;
            pcur = pcur->next;
        }


        if(last) {
            last->next = p;
            last = last->next;
        } else {
            last = p;
            head = last;
        }
    } while(answer=='Y'||answer=='y');

    last->next = NULL;

    save(head);    /* store infor into file */
    printf("\n");
    printf("\t保存成功!!!\n\n");
    return head;
}
int main()
{
    STUDENT *head = NULL;
    head = read(head);
    //head = init();


    int nam,secret;        /*登录操作使用的变量*/
    printf("\n\n\n\n");
    printf("\t------------------------学生学学籍管理系统------------------------\n");
    printf("\n\n");
    printf("\t\t\t\t账号:");
    scanf("%d", &nam);
    printf("\n");
    printf("\t\t\t\t密码:");
    scanf("%d", &secret);
    //system("cls");

    if(nam == 172021 && secret==172021)
    {
        printf("\n\n");
        printf("\t\t\t\t登录成功!!!\n\n");

        for(;;)
        {
            switch(menu_select())
            {
                case 1:
                    head = create(head);//注册
                    break;

                case 2:
                    search(head);//查询
                    break;

                case 3:
                    revise(head);//修改
                    break;
                case 4:
                    head=del(head);//删除
                    break;
                case 5:
                    printstu(head);//显示信息
                    break;
                case 6:
                    exit(0);//退出系统
                    break;
                default:
                    printf("输入错误");
                    break;

            }
        }
    }
    else
    {
        printf("输入错误,请重新登录");
    }



}
Hhq128 2018-03-08
  • 打赏
  • 举报
回复
谢谢你啊,我对你给的答案做了调整,主函数我并没有改动,而是在显示函数和搜索函数之前先读一遍,这样就可以不用改变原来的结构。然后退出时做一次保存,这样也可以,谢谢你给我的参考! int main() { STUDENT *head; head = init(); int nam,secret; /*登录操作使用的变量*/ printf("\n\n\n\n"); printf("\t------------------------学生学学籍管理系统------------------------\n"); printf("\n\n"); printf("\t\t\t\t账号:"); scanf("%d", &nam); printf("\n"); printf("\t\t\t\t密码:"); scanf("%d", &secret); //system("cls"); if(nam == 172021 && secret==172021) { printf("\n\n"); printf("\t\t\t\t登录成功!!!\n\n"); for(;;) { switch(menu_select()) { case 1: head = create();//注册 break; case 2: head=read(head); search(head);//查询 break; case 3: revise(head);//修改 break; case 4: head=del(head);//删除 break; case 5: head=read(head); printstu(head);//显示信息 break; case 6: save(head); exit(0);//退出系统 break; default: printf("输入错误"); break; } } } else { printf("输入错误,请重新登录"); }
Hhq128 2018-03-07
  • 打赏
  • 举报
回复
求帮忙修改 read 函数

69,382

社区成员

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

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