c语言录入文件信息时如何确定某一学号的人已存在

如题所述

思路:

1、用变量接收输入。

2、读取文件内容到内存中(比如用链表保存)。

3、循环遍历内存数据,对比输入的值,存在相同则表示已存在。

下面代码是我写得演示:

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <windows.h>

#define P "C:\\1.txt"

typedef struct stu_info

{

    int sNum;// 学号

    char name[20];//姓名

    struct stu_info *next;

}SINFO;

int insert2File(char path[]);// 向文件末尾插入一条学生信息

SINFO * selectALLFILE(char path[]);//只读模式打开文本,获取信息, 返回信息链表头节点(该函数单独调用的话,记得调用freeSINFOS释放内存)

int checkSN(SINFO sinfo,char path[]);//检查路径下文件中,学号是否存在,存在返回1,否则返回0

int freeSINFOS(SINFO *sHead);//释放链表内存

void showSINFOS(SINFO *sHead);//打印链表信息

int main()

{

    SINFO *sHead=NULL;

    while(1)

    {

        sHead=selectALLFILE(P);

        showSINFOS(sHead);

        insert2File(P);

        free(sHead);

        sHead=NULL;

        printf("按任意键继续录入。。。\n"),getchar();

        system("cls");

    }

    return 0;

}

void showSINFOS(SINFO *sHead)

{

    printf("当前从文件加载到内存中的信息为:\n");

    if(sHead && sHead->next)

        while(sHead->next)

        {

            printf("学号:%d   姓名:%s\n",sHead->next->sNum,sHead->next->name);

            sHead=sHead->next;

        }

}

int insert2File(char path[])

{

    SINFO sinfo;

    FILE *fp=NULL;

    if(!(fp=fopen(path,"at+")))return 0;

    printf("请输入要插入的学生信息:\n");

    printf(" 学号:"),scanf("%d",&sinfo.sNum);

    printf(" 姓名:"),scanf("%s",sinfo.name),getchar();

    if(checkSN(sinfo,path))

    {

        printf("当前学号已存在!新增失败!\n");

        return 0;

    }

    fprintf(fp,"%d %s\n",sinfo.sNum,sinfo.name);

    fclose(fp);

    printf("新增信息插入成功!\n");

    return 1;

}

SINFO *selectALLFILE(char path[])//查询文件

{

    SINFO *sHead=NULL,*sTail=NULL,*sNew=NULL,sTemp;

    FILE *fp=NULL;

    if(!(fp=fopen(path,"rt"))) return NULL;

    fseek(fp,0,SEEK_SET);

    sHead=(SINFO *)malloc(sizeof(SINFO));

    if(!sHead)return NULL;

    sHead->next=NULL;

    while(fscanf(fp,"%d %s\n",&sTemp.sNum,sTemp.name)!=-1)

    {

        sNew=(SINFO *)malloc(sizeof(SINFO));

        if(!sNew)return NULL;

        sNew->next=NULL;

        sNew->sNum=sTemp.sNum;

        sprintf(sNew->name,"%s",sTemp.name);

        if(!sHead->next)

            sHead->next=sNew;

        else

            sTail->next=sNew;

        sTail=sNew;

    }

    fclose(fp);

    return sHead;

}

int checkSN(SINFO sinfo,char path[])//检查学号是否存在,存在返回1,否则返回0

{

    SINFO *sHead=NULL;

    sHead=selectALLFILE(path);

    if(!sHead) return 0;

    if(!sHead->next) {freeSINFOS(sHead);return 0;}

    while(sHead->next)

    {

        if(sinfo.sNum==sHead->next->sNum) return 1;

        sHead=sHead->next;

    }

    freeSINFOS(sHead);

    return 0;

}

int freeSINFOS(SINFO *sHead)

{

    SINFO *sTemp=NULL;

    if(!sHead)return 1;

    while(sHead->next)

    {

        sTemp=sHead->next->next;

        free(sHead->next);

        sHead->next=sTemp;

    }

    free(sHead);

    return 1;

}

温馨提示:答案为网友推荐,仅供参考
相似回答