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

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

思路:

1、用变量接收输入。

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

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

下面代码是我写得演示:

#include <stdioh>

#include <stdlibh>

#include <malloch>

#include <windowsh>

#define P "C:\\1txt"

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",&sinfosNum);

  printf(" 姓名:"),scanf("%s",sinfoname),getchar();

  if(checkSN(sinfo,path))

  {

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

      return 0;

  }

  fprintf(fp,"%d %s\n",sinfosNum,sinfoname);

  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",&sTempsNum,sTempname)!=-1)

  {

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

      if(!sNew)return NULL;

      sNew->next=NULL;

      sNew->sNum=sTempsNum;

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

      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(sinfosNum==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;

}

对于数组type a[N], 要将其写入文件有两种方式可以使用。

1 将数组以二进制方式写入文件。如

fwrite(a, sizeof(a), 1, fp);

可以将数组整体以二进制方式写入文件中。

2 按照元素,依次写入文件。具体写入格式与数组的类型有关。如为int数组可以写作:

int i;

for(i = 0; i < N; i++)

fprintf("%d,", a[i]);

两种方法各有优缺点:

1 代码量上,第一种方式更简单高效;

2 运行效率上,第一种方法的执行效率更高;

3 文件空间大小上:

如果数组中的字符串元素较多,那么二者写入后目标文件大小相似,或者第二种方式占用的空间较小。

如果数组中的整型或浮点型数据较多,那么第一种方式占用的空间较小。

4 目标文件可读性:

第一种方法得到的文件是二进制文件,需要用专门的阅读器打开,且必须是专业人士才可以读懂。

第二种方法更直观,直接打开文本文件就可以阅读输出结果。

从键盘输入一行字符,写入一个文件, 再把该文件内容读出显示在屏幕上。

#include<stdioh>

main()

{

FILE fp;

char ch;

if((fp=fopen("string","wt+"))==NULL)

{

printf("Cannot open file strike any key exit!");

getch();

exit(1);

}

printf("input a string:\n");

ch=getchar();

while (ch!='\n')

{

fputc(ch,fp);

ch=getchar();

}

rewind(fp);

ch=fgetc(fp);

while(ch!=EOF)

{

putchar(ch);

ch=fgetc(fp);

}

printf("\n");

fclose(fp);

}

以上就是关于c语言录入文件信息时如何确定某一学号的人已存在全部的内容,包括:c语言录入文件信息时如何确定某一学号的人已存在、c语言怎么把一个数组里的值存入文本文件里、C语言如何将字符串写入文本文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10124534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存