2301_76905872 2023-04-29 13:57 采纳率: 80%
浏览 15
已结题

为什么我的程序在while循环里出不来,我的文件里只有一个student的结构体呀

img



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

typedef struct book{
    char name[10]={0};
    char id[8]={0};        //存八位编号
    int loaned;        //借出
    int num;        //总数
    double price;
    char publisher[10]={0};
    char author[5]={0};
    struct book*next;
}book;

typedef struct student{
    char id[8]={0};
    char name[10]={0};
    int overdue;        //逾期数
    char borrow[5][8]={0};    //借书数,最大为5,用编号存
    struct student*next;
}student;


student* Is_student_id(char *id){
    student sd,*p=NULL;
    FILE*fp=NULL;
    fp=fopen("student.dat","rb");
    if(fp==NULL){
        printf("打开文件失败!");
        exit(1);
    }
    int flag=0;
    fseek(fp,0,SEEK_SET);
    while(!feof(fp)){
        fwrite(&sd,sizeof(student),1,fp);
        if(strcmp(sd.id,id)==0){
            p=&sd;
            flag=1;
        }
    }
    return p;
}
int main(){
//    student sd = {"123456","asd",1,"格林"};
//    FILE*fp=NULL;
//    fp=fopen("student.dat","w");
//    fwrite(&sd,sizeof(student),1,fp);
    
    if(Is_student_id("123456")){
        printf("asd");
    }else printf("qwe");
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-29 14:16
    关注

    基于Monster 组和GPT的调写:

    在Is_student_id函数中,存在几个问题:

    fwrite函数是写入操作,应该用于将数据写入到文件中,而不是从文件中读取数据。应该使用fread函数来从文件中读取数据。
    在while循环中,没有判断fread函数的返回值,也没有判断读取的数据是否为最后一个数据。因此,可能会出现读取多余的数据的情况,导致指针越界或者陷入死循环。
    在while循环中,每次读取一个student结构体,但是没有将它添加到链表中,也没有判断当前student结构体是否是需要查找的结构体。因此,即使读取到了正确的数据,也无法正确返回对应的指针。
    

    为了解决这些问题,你可以修改Is_student_id函数的实现:

    
    student* Is_student_id(char *id) {
        student *p = NULL, *head = NULL;
        FILE *fp = NULL;
        fp = fopen("student.dat", "rb");
        if (fp == NULL) {
            printf("打开文件失败!");
            exit(1);
        }
        head = (student*)malloc(sizeof(student));
        while (fread(head, sizeof(student), 1, fp)) {
            if (strcmp(head->id, id) == 0) {
                p = head;
                break;
            }
            head->next = (student*)malloc(sizeof(student));
            head = head->next;
        }
        head->next = NULL;
        fclose(fp);
        return p;
    }
    
    

    这里使用了一个链表来保存读取到的student结构体,同时在读取每个结构体时,判断它是否是需要查找的结构体,如果是,则将对应的指针返回。如果读取到了最后一个结构体,就将链表的末尾指针设为NULL,并关闭文件,最后返回指针。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战