wuyibigbro 2022-10-13 07: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 07: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);                         //关闭文件
    }
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    wuyibigbro 2022-10-13 10:56

    分号删除了那不就一直在while里了吗,不过光break确实不行,用个goto得了

    回复
    wuyibigbro 2022-10-13 11:12

    谢谢老哥 我先照着你的搞一下

    回复
    wuyibigbro 2022-10-13 11:20

    老哥好像可以了,等我全部替换运行一下,如果可以我就采纳

    回复
查看更多回答(3条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月13日
  • 修改了问题 10月13日
  • 修改了问题 10月13日
  • 展开全部
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部