局部变量定义是非法的,遇到意外的文件结尾两个错误怎么改,求指导

局部变量定义是非法的,遇到意外的文件结尾两个错误怎么改

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct student
{ 
    int qinshi;
  int chuangwei;
  char name[20];
  char phone[12];
  long num;
}STU;
void shuru()
{ int i,n;
  STU a;
  FILE *fp;
  fp=fopen("C:\\学生宿舍系统.dat","wb");
  if(fp==NULL)
  { 
      printf("!");
      return;
  }
  system("cls");
  printf("录入的个数是: ");
  scanf("%d",&n);
  for(i=0;i<n;i++)
  { 
      printf("\t寝室号:");
    scanf("%d",&a.qinshi);
    printf("\t床位:");
    scanf("%d",&a.chuangwei);
    printf("\t姓名:");
    scanf("%s",a.name);
    printf("\t手机号:");
    scanf("%s",a.phone);
    printf("\t学号:");
    scanf("%ld",&a.num);
    fwrite(&a,sizeof(STU),1,fp);
  }
   fclose(fp);
}
void zhuijia()
 {
    int i,n;
    STU a;
    FILE *fp;
    system("cls");
    if((fp=fopen("C:\\学生宿舍系统.dat","ab"))==NULL)
    {printf("error!\n");exit(0);}
    printf("\n\n\t请输入追加人数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
 {
    printf("\t寝室号:");
    scanf("%d",&a.qinshi);
    printf("\t床位:");
    scanf("%d",&a.chuangwei);
    printf("\t姓名:");
    scanf("%s",a.name);
    printf("\t手机号:");
    scanf("%s",a.phone);
    printf("\t学号:");
    scanf("%ld",&a.num);
    fwrite(&a,sizeof(STU),1,fp);
 }
  fclose(fp);
}
void xianshi()
{STU a;
FILE*fp;
system("cls");
if((fp=fopen("C:\\学生宿舍系统.dat","rb"))==NULL)
{
    printf("error!\n");exit(0);
}
rewind(fp);
printf("\n\n\n\t\b\b寝室号\t床位\t姓名\t 手机号\t学号\n");
while(fread(&a,sizeof(STU),1,fp)!=0)
      printf("%d\t%d\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
fclose(fp);
}
void chaxunbyname()
{
    int f=0;
    char na[20];
    STU a;
    FILE *fp;
    fp=fopen("C:\\学生宿舍系统.dat","rb");
    if(fp==NULL)
    {printf("无法打开!\n");exit(1);}
    printf("请输入要查找姓名:");
    scanf("%s",na);
    while(fread(&a,sizeof(STU),1,fp)!=0)
    if(strcmp(na,a.name)==0)
{
    printf("寝室号\t床位\t姓名\t  手机号\t学号\n");
    printf("%d\t%d\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
    f=1;
}
    if(f==0) printf("没有该学生信息。");
    fclose(fp);
}
void chaxunbyxuehao()
{
    int f=0,x=0;
  STU a;
      FILE *fp;
      fp=fopen("C:\\学生宿舍系统.dat","rb");
      if(fp==NULL)
      {printf("打开失败!\n");exit(1);
      scanf("%d",&x);
      while(fread(&a,sizeof(STU),1,fp)!=0)
      if(x==a.num)
      {
      printf("寝室号\t床位\t姓名\t   手机号\t学号\n");
      printf("%d\t%d\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
      f=1;
      }
  if(f==0) printf("没有该寝室的信息。");
  fclose(fp);
}
void chaxun()
{   
     int a;
     system("cls");
     printf("\n\n\t\t你现在已经进入学生宿舍管理系统\n");
     printf("\t\t\t按姓名查询输入1\n");
     printf("\t\t\t按学号查询输入2\n");
     printf("\t\t\t退出输入3\n");
     printf("\t\t\t请输入命令: ");
     scanf("%d",&a);
     switch(a)
     {
      case1:chaxunbyname();break;
      case2:chaxunbyxuehao();break;
      caea3:break;
     }
}
void shanchu()
{   
    int s;
    struct student a[10];
    int i=0, n, f=0, k;
    long num;
    FILE *fp;
    printf("\t\t\t 请输人管理密码!");
    scanf("%d", &s);
    if(s!=0)printf("管理密码错误!");
    else
    {
        fp=fopen("C:\\学生宿舍系统.dat","r");
        if (fp==NULL)
        {
            printf("打开C:\\学生宿舍系统.dat失败!\n");
         exit(1);
        }
        fseek (fp,0,2) ;
        n=ftell(fp)/sizeof(struct student) ;
        rewind (fp);
        printf("输人学号:");
        scanf ("%ld", &num);
        for(i=0;i<n;i++)
        fread (&a[i], sizeof (STU) , 1, fp);
        for(i=0;i<n;i++)
        if (num==a[i].num)
        {  
            printf("按任意键删除");
           f=1;
           k=1;
           break;
        }
        else 
            f=0;
        fclose (fp) ;
        if(f==0)
        printf("未找到对应学生信息\n");
        else
        {
          for(i=k;i<n-1;i++)
          a[i]=a[i+1];
          n--;
          fp=fopen("C:\\学生宿舍系统.dat","w");
          if (fp==NULL)
          { 
              printf("打开C:\\学生宿舍系统.dat 失败!\n");
            exit(1);
          }
          for (i=0;i<n;i++)
          fwrite (&a[i], sizeof(struct student),1,fp);
          fclose(fp);
        }
     getchar();getchar();
    }
}

void main()
{
    int a;
do
{
    printf("\n\n\n\t\t\t欢迎进入学生宿舍系统");
    printf("\t\t\t\t\t\t\t录入学生信息输入1\n");
    printf("\t\t\t显示学生信息信息输入2\n");
    printf("\t\t\t查询学生信息输入3\n");
    printf("\t\t\t追加学生信息输入4\n");
    printf("\t\t\t删除学生信息输入5\n");
    printf("\t\t\t退出系统输入7\n");
    printf("\t\t\t输入命令:  ");
    scanf("%d",&a);
    switch(a)
    {
case 1:shuru();break;
case 2:xianshi();break;
case 3:chaxun();break;
case 4:zhuijia();break;
case 5:shanchu();break;
case 7:exit(0);
    }
}while(a!=0);
}


有两个错误需要修复:

  1. 局部变量定义错误:
    在函数chaxun()中,case1case2的定义应该改为case 1case 2,即添加空格,以正确定义case语句。

    switch(a)
    {
      case 1: chaxunbyname(); break;
      case 2: chaxunbyxuehao(); break;
      case 3: break;
    }
    
  2. 意外的文件结尾错误:
    在函数chaxunbyxuehao()中,有一个错误的大括号位置,应将scanf("%d",&x);放在if语句的外面。

    void chaxunbyxuehao()
    {
        int f=0, x=0;
        STU a;
        FILE *fp;
        fp=fopen("C:\\学生宿舍系统.dat","rb");
        if(fp==NULL)
        {
            printf("打开失败!\n");
            exit(1);
        }
        scanf("%d",&x);
        while(fread(&a,sizeof(STU),1,fp)!=0)
        {
            if(x==a.num)
            {
                printf("寝室号\t床位\t姓名\t   手机号\t学号\n");
                printf("%d\t%d\t%s\t%s\t%ld\n",a.qinshi,a.chuangwei,a.name,a.phone,a.num);
                f=1;
            }
        }
        if(f==0) printf("没有该寝室的信息。");
        fclose(fp);
    }
    
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/379804
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:文件的输入输出:从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件保存
  • 除此之外, 这篇博客: 本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符中的 函数接口定义: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    char *match( char *s, char ch1, char ch2 );

    函数match应打印s中从ch1ch2之间的所有字符,并且返回ch1的地址。

  • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商视觉的排版与应用方法课程中的 订单页面的表单视觉优化及细节处理方法小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对于问题1:局部变量被判定为非法,可以根据编程语言的规则和错误提示来进行解决。

    一般情况下,局部变量被判定为非法是因为变量的作用域或定义方式出现问题。

    1. 作用域问题:检查变量的作用域,确保变量在使用之前已经被声明和定义。在循环、条件语句或函数内部使用局部变量时,需要确保变量在使用之前已经被声明。

    2. 定义方式问题:检查变量的定义方式,确保变量的类型和命名符合编程语言的规范。一些常见的错误包括使用了已经定义的关键字作为变量名、变量名包含特殊字符等。此外,还要确保变量的声明与实际的使用类型匹配。

    例如,在C语言中,如果遇到局部变量非法的问题,可以检查以下几个方面:

    • 变量的作用域是否正确,是否在使用之前已经定义。
    • 变量的命名是否符合规范,不要使用关键字或特殊字符作为变量名。
    • 变量的类型是否正确,与实际使用的表达式或函数返回值类型匹配。

    对于问题2:意外的文件结尾错误,可以根据编程语言的规则和错误提示来进行解决。

    意外的文件结尾错误一般是因为文件不完整或语法错误导致的。以下是一些常见的解决方法:

    1. 检查文件是否完整:确保所有的代码都已经被写入文件中,并且没有遗漏。

    2. 检查代码语法:使用编程语言的编译器或解释器来检查代码语法错误,确保代码中没有语法错误。

    3. 检查代码逻辑:检查代码中的逻辑错误,确保程序的流程和操作是正确的。有时候意外的文件结尾错误是由于代码逻辑错误导致的。

    如果以上方法都没有解决问题,可以考虑以下几点:

    • 查看错误信息:查看错误提示信息,确定错误的具体原因和位置。
    • 检查相关代码段:检查与错误相关的代码段,确保代码的完整性和正确性。
    • 搜索和参考资料:搜索相关的解决方案和参考资料,例如使用特定的编程模式或调试工具来解决问题。

    请注意,具体的解决方法和代码示例可能因编程语言和具体情况而异。所以在实际解决问题时,建议结合具体的代码和错误提示来进行分析和解决。如果以上方法都没有解决问题,我们可能需要更多的详细信息才能确切找到问题的原因和解决方案。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^