fp指针为空解决不了

fp指针为空 返回直一直是0
放出部分代码 进去后直接选1 enter就ok


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int i,n, num = 0;
void query();//查询函数//
void xiugai();//修改函数//
void output();//输出函数//
void input();//输入函数//
void count();//读取文件//
void tuichu();//退出函数//
void deletee();//删除函数//
void ave();//求全班平均值函数//

//学生结构体//
struct student
{
    char name[32]; //姓名
    int number[3]; //学号
    float chinese; //语文成绩 
    float math; //数学成绩 
    float english; // 英语成绩
    float sum;
}stu[1];

void count()
{
    FILE* fp;  //定义文件指针fp//
    fp = fopen_s(&fp,"stu.dat", "wb");    
    if (fp == NULL)                        //判断文件是否为空//
    {
        printf("Cannot open file!");
        exit(0);
    }
    fclose(fp); //关闭文件//
}
void main() // 菜单 //
{
        int i;
        system("cls");
        printf("\t\t   欢迎进入学生信息管理系统\n");
        printf("\t\t================================\n");
        printf("\t\t*****    请选择操作序号:   *****\n");
        printf("\t\t*       1.输入学生信息         *\n");
        printf("\t\t*       2.输出学生信息         *\n");
        printf("\t\t*       3.修改学生信息         *\n");
        printf("\t\t*       4.查询学生信息         *\n");
        printf("\t\t*       5.删除学生信息         *\n");
        printf("\t\t*      6.查看班级平均分        *\n");
        printf("\t\t*           0.退出             *\n");
        printf("\t\t================================\n");
        scanf_s("%d", &i);
        system("cls");
      switch (i)
        {
        case 0:tuichu(); break;  //退出系统//
        case 1:input(); break;    //输入学生信息//    
        case 2:output(); break;     //输出学生信息//
        case 3:xiugai(); output(); break;    //修改学生信息//
        case 4:query(); break;  //查询学生信息//
        case 5:deletee(); break;//删除学生信息//
        case 6:ave(); break;//班级平均分//
        default:
            printf("输入错误\n");     //错误纠正// 
        }
}
void input() //成绩输入//
{
    int i,j;
    const int sum;
    char ch;
    FILE *fp;
    printf("请输入学生的人数:\n");
    scanf_s("%d", &sum);
    fp = fopen_s(&fp, "stu.dat", "wt");
    for (i = 0; i < sum; i++)
    {
        printf("输入学生学号\n");
        scanf_s("%d", &stu[i].number);

        printf("输入学生姓名\n");
        scanf_s("%s", stu[i].name, sizeof(stu[i].name));

        printf("输入学生语文成绩\n");
        scanf_s("%f", &stu[i].chinese);

        printf("输入学生数学成绩\n");
        scanf_s("%f", &stu[i].math);

        printf("输入学生英语成绩\n");
        scanf_s("%f", &stu[i].english);

        printf("\t是否继续输入?\n");
        printf("\tY   or   N\n");
        do 
        {
            ch = getchar();
            if (ch == 'Y' || ch=='y')
                break;
            else
                if (ch == 'N' || ch=='n')
                    main();
                else continue;

        } while (1);
        system("cls");
    }
    if (fp == NULL)
        return 0;
    for (j = 0; j < i; j++)
        fwrite(&stu[j], sizeof(struct student), 1, fp);
    fclose(fp);
    printf("录入成绩成功!\n");
    system("cls");
    main();
}

img


数万成绩就这样了 按我的程序来看应该写进文件然后输出 “输入成功”

fp = fopen_s(&fp,"stu.dat", "wb");
改成
fopen_s(&fp,"stu.dat", "wb");
就行了,不要返回值啊

自己写过一个学生管理系统(C语言)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

typedef struct node     
{
    int chinese;
    int math;
    int english;
    int num;
    char name[10];
    struct node *prev;
    struct node *next;
}node;

node *initlist(void)
{
    node *new=malloc(sizeof(node));
    if(new == NULL)
    {
        printf("malloc fail\n");
        return NULL;
    }   
    new->chinese=0;
    int math=0;
    int english=0;
    new->num=0;
    new->name[10];
    new->next=new;
    new->prev=new;
    return new;
}

//从尾插入数据
void initlisthead1(node *head,node *new)
{
    new->prev=head->prev;
    new->next=head;      

    head->prev->next=new;
    head->prev=new;
}

//查询学生的信息
node *find_data(node *head,int data)
{
    node *p=NULL;
    for(p=head->next;p!=head;p=p->next)
    {
        if(p->num == data)
        {
            return p;
        }
    }
    return NULL;
}

//删除学生信息
node *del_data(node *head,int data)
{  
    node *del;    
    node *p;
    del=find_data(head,data);
    if(del == NULL)
    {
        return NULL;
    }

    del->prev->next=del->next;
    del->next->prev=del->prev;
    
    del->next=del;
    del->prev=del;
    
    return del;
}

//解除节点
void remo(node *head,node *q)
{
    node*p=NULL;
    for(p=head;p->next!=q;p=p->next);
        p->next=q->next;
        q->next=NULL;
}

//总分排序
void sort(node *head)
{ 
  node *p=NULL;
  node *tmp=NULL;
  int len=0;
  for(p=head->next;p!=head;p=p->next)
  { 
    len++;
  }
  for(int i=0;i<len-1;i++)
  {
    p=head->next;
    for(int j=0;j<len-1-i;j++)
    {    
        tmp=p->next;
        if(p->chinese+p->math+p->english > tmp->chinese+tmp->math+tmp->english)
        {
            remo(head,p);
            p->next=tmp->next;
            tmp->next=p;
        }
        else
        {
            p=p->next;
        }
    }
  }

}

//显示数据
void display(node *head)
{
   node *p;
      printf("名字:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("    \t%s",p->name);
   }
   printf("\n");

   printf("学号:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("    \t%d",p->num);
   }
   printf("\n");

   printf("语文成绩:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("\t%d",p->chinese);
   }
   printf("\n");

   printf("数学成绩:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("\t%d",p->math);
   }
   printf("\n");

   printf("英语成绩:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("\t%d",p->english);
   }
   printf("\n");

   printf("总分成绩:");
   for(p=head->next;p!=head;p=p->next)
   {
        printf("\t%d",p->chinese+p->math+p->english);
   }
   printf("\n");
}

//销毁链表
void destroy(node *head)
{   
    
    node *p=NULL,*tmp=NULL;
    for(p=head->next;p!=head;p=tmp)
        {
            tmp=p->next;

            free(p);
        }
        head->next=head;
        head->prev=head;
}

int main()
{   
    node *head,*new,*find,*del;
    
    char ch,sh;

    int data,i=1,code,data1;

    head=initlist();

    while(1)
    {
        printf("     学生系统的操作功能:\n");
        printf("\t\t\tb:生成学生成绩数据:\n");
        printf("\t\t\tc:查找学生:\n");
        printf("\t\t\td:删除学生的信息:\n");
        printf("\t\t\tq:按总分排序:\n");
        printf("\t\t\tp:显示学生的信息:\n");
        printf("\t\t\ts:修改学生的信息:\n");
        printf("\t\t\tt:销毁信息:\n");

        ch=getchar();
        switch (ch)
        {        
         case 'b':
                  srand((int)time(0));
                  new=initlist();
                  scanf("%s",new->name);
                  new->chinese=rand()%100+1;
                  new->math=rand()%100+1;
                  new->english=rand()%100+1;
                  new->num=i++;
                  initlisthead1(head,new);                 
                  break;

        case 'c':
                  printf("输入学号:");
                  scanf("%d",&data);
                  find=find_data(head,data);
                  if(find!=NULL)
                  { 
                    printf("查询到该学生\n");
                    printf("名字:");
                    printf("    \t%s",find->name);
                    printf("\n");

                    printf("学号:");
                    printf("    \t%d",find->num);
                    printf("\n");

                    printf("语文成绩:");
                    printf("\t%d",find->chinese);
                    printf("\n");

                    printf("数学成绩:");
                    printf("\t%d",find->math);
                    printf("\n");

                    printf("英语成绩:");
                    printf("\t%d",find->english);
                    printf("\n");

                    printf("总分成绩:");
                    printf("\t%d",find->chinese+find->math+find->english);
                    printf("\n");
                  }
                  else 
                  {
                    printf("查无此人,请重新输入\n");
                  }                
                  break;

        case 'd':
                 printf("输入学号\n");
                 scanf("%d",&data);                 
                 del=del_data(head,data);
                 if(del == NULL)
                 {
                    printf("查无此人,请重新输入\n");
                 }
                 else
                 {
                    printf("删除成功\n");
                 }
                 break;

        case 'q':
                 sort(head);              
                 break;

        case 'p':display(head);
                 break;
        
        case 's':
                 printf("权限不够,输入密码验证\n");
                 scanf("%d",&code);
                 if(code == 123456)
                 {
                  printf("成功进入内部系统\n");
                  printf("输入学号\n");
                  scanf("%d",&data);
                  find=find_data(head,data);
                  if(find!=NULL)
                  { 
                    printf("查询到该学生\n");
                    printf("名字:");
                    printf("    \t%s",find->name);
                    printf("\n");

                    printf("学号:");
                    printf("    \t%d",find->num);
                    printf("\n");

                    printf("语文成绩:");
                    printf("\t%d",find->chinese);
                    printf("\n");

                    printf("数学成绩:");
                    printf("\t%d",find->math);
                    printf("\n");

                    printf("英语成绩:");
                    printf("\t%d",find->english);
                    printf("\n");

                    printf("总分成绩:");
                    printf("\t%d",find->chinese+find->math+find->english);
                    printf("\n");
                    printf("你需要修改什么:\n");
                    printf("              a.名字\n");
                    printf("              b.语文成绩\n");
                    printf("              c.数学成绩\n");
                    printf("              d.英语成绩\n");
                    while(getchar()!='\n');
                    sh=getchar();
                    switch(sh)
                    {                        
                    case 'a':printf("修改后的名字:\n");
                             scanf("%s",find->name);
                        break;
                    
                    case 'b':printf("修改后的语文成绩:\n");
                             scanf("%d",&find->chinese);
                        break;
                    
                    case 'c':printf("修改后的数学成绩:\n");
                             scanf("%d",&find->math);
                        break;
                    
                    case 'd':printf("修改后的英语成绩:\n");
                           scanf("%d",&find->english);
                        break;

                    default:
                        break;
                    }
                  }
                  else 
                  {
                    printf("查无此人,请重新输入\n");
                  }
                 }
                 else
                 {
                  printf("密码错误无法访问\n");
                  break;  
                 }
                 break;
        
        case 't':destroy(head);
                 break;
        default:
                 break;
        }
    while(getchar()!='\n'); 
    }
}