wuyibigbro 2022-10-13 15:17 采纳率: 100%
浏览 67
已结题

fread函数的相关问题

主要是对结构体和fread函数使用规则的不熟悉,导致该段程序能过编译但运行出错。目前属于一筹莫展的状态,从断点的执行的结果来看,问题出在第一次使用fread函数时。对文件使用二进制ab+写入还是用w+直接写入都无法避免该问题,之前看到sizeof不能用于二进制的长度计算,但好像也不是该问题。求各位看看问题在哪,谢谢了。

#define N 100                                   //最大容量为100
typedef struct student                                //定义一个结构
{
    char name[10];
    char number[15];
    char category[10];
    char address[20];
    char birthday[10];
}people;
struct student stu[N];
//菜单
void menu()                                           //目录
{
    system("cls");                                      //清屏
    
    printf("  欢迎使用手机通讯录 \n");
    printf("      1.添加联系人   \n");
    printf("      2.查询联系人   \n");
    printf("      3.修改联系人   \n");
    printf("      4.删除联系人   \n");
    printf("      5.拨号         \n");
    printf("      6.生日查询     \n");
    printf("      0.退出         \n");
    
    printf("\n");

    printf("请选择相应的功能:");
}

void input()
{
    FILE* fp;                                         //定义文件指针
    people ry, s;  // 定义两个people结构体的量
    int size=0;
    if ((fp = fopen("people.dat", "w+")) == NULL)
    {
        printf("can't open file!\n"); exit(0);
    }
    printf("\n录入格式为\n姓名:号码:类别:邮箱:生日:\n");
    while ((fp = fopen("people.dat", "w+")) != NULL);
    {
        printf("请输入姓名:");
        scanf_s("%s", &ry.name,100);//100避免造成溢出
        printf("请输入电话号码:");
        scanf_s("%s", &ry.number,100);
        printf("请输入类别(A办公类B个人类C商务类):");
        scanf_s("%s", &ry.category,100);
        printf("请输入邮箱地址:");
        scanf_s("%s", &ry.address,100);
        printf("请输入生日:");
        scanf_s("%s", &ry.birthday,100);
        fseek(fp, 0, SEEK_SET);//指针定位到文件开始位置
       ** fread(&s, sizeof(people), 1, fp);//s**
        while (!feof(fp))//条件不是文件尾时执行后续代码
        {
            if (strcmp(s.number, ry.number) == 0)
            {
                printf("号码已经存在,不能记录.\n"); break;
            }//遇到有相同的号码
            fread(&s, sizeof(people), 1, fp);//s;
        }
        if (feof(fp))                     //读取后如没有相同的号码
            fwrite(&ry, sizeof(people), 1, fp); //将信息写入文件
    }
    fclose(fp);                         //关闭文件
    getchar();                          //接受一个输入
}


![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/213393956566185.png "#left")
  • 写回答

4条回答 默认 最新

  • 快乐鹦鹉 2022-10-13 15:49
    关注

    while ((fp = fopen("people.dat", "w+")) != NULL); 这行后面的分号删除
    printf("号码已经存在,不能记录.\n"); break;
    光break也不行啊,下面的fwrite不照样运行吗?还是会写入啊

    void input()
    {
        FILE* fp;                                         //定义文件指针
        people ry, s;  // 定义两个people结构体的量
        int size=0;
        if ((fp = fopen("people.dat", "r+")) == NULL)
        {
            printf("can't open file!\n"); exit(0);
        }
        printf("\n录入格式为\n姓名:号码:类别:邮箱:生日:\n");
        printf("请输入姓名:");
        scanf_s("%s", &ry.name,100);//100避免造成溢出
        printf("请输入电话号码:");
        scanf_s("%s", &ry.number,100);
        printf("请输入类别(A办公类B个人类C商务类):");
        scanf_s("%s", &ry.category,100);
        printf("请输入邮箱地址:");
        scanf_s("%s", &ry.address,100);
        printf("请输入生日:");
        scanf_s("%s", &ry.birthday,100);
        fseek(fp, 0, SEEK_SET);//指针定位到文件开始位置
        fread(&s, sizeof(people), 1, fp);//s**
        while (!feof(fp))//条件不是文件尾时执行后续代码
        {
            if (strcmp(s.number, ry.number) == 0)
            {
                printf("号码已经存在,不能记录.\n"); return;
            }//遇到有相同的号码
            fread(&s, sizeof(people), 1, fp);//s;
        }
        fseek(fp,0,SEEK_END);
        fwrite(&ry, sizeof(people), 1, fp); //将信息写入文件
        fclose(fp);                         //关闭文件
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 已采纳回答 10月13日
  • 修改了问题 10月13日
  • 修改了问题 10月13日
  • 展开全部

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持