思路:
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;
}