m0_65654051 2022-09-14 22:36 采纳率: 100%
浏览 18
已结题

vs环境下运行frad函数异常

问题遇到的现象和发生背景

在vs环境中运行fread函数 发生异常,但是同样的代码在 dev—c中却能正常运行

用代码块功能插入代码,请勿粘贴截图

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

struct student
{
    int id;
    char* name;
    char* phone;
};

void CreatFile1()
{
    FILE* fp = fopen("写入结构体.txt", "w");
    if (fp == NULL)
    {
        perror("写入结构体.txt开启失败");
        exit(1);
    }
    struct student st[] = { 1,"lizhigang","18328746048",2,"liusi","111149223",3,"liyuqi","12345678912" };
    fwrite(st, sizeof(struct student), 3, fp);

    fclose(fp);
}



void ReadFile1()
{
    FILE* ffp = fopen("写入结构体.txt", "r");
    if (ffp == NULL)
    {
        perror("写入结构体.txt开启失败");
        exit(1);
    }
    struct student st[3] = { 0 };

    while (1)

    {
        int i = fread(&st[0], sizeof(struct student), 1, ffp);
        if (i == 0)
            break;
        printf("学号:%d\t姓名:%p\t电话:%p\n", st[0].id, st[0].name, st[0].phone);
    }

    fclose(ffp);
}

int main(void)
{
    //CreatFile1();
// 这里如果在已经创建了文件的情况下 注掉CreatFile1()就不能正常运行,只有这两行都在才能正常运行
    ReadFile1();
    return 0;
}
运行结果及报错内容

img

我的解答思路和尝试过的方法
先运行CreatFile1(); 在运行    ReadFile1();就行,如果先运行了CreatFile1(); 

然后注掉在运行ReadFile1();就会报错 不懂是为什么

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-09-14 23:03
    关注

    跟结构体的定义相关,它的 name phone 两个成员只是指针,当用fwrite()函数写入文件时,写入的是只占4个字节或8个字节的字符串在内存里的地址值,所以先运行CreatFile1(); 再运行ReadFile1();就行,如果先运行了CreatFile1(); 然后注掉再单独运行ReadFile1();就会报错,因为那段地址不存在了,这么改:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct student
    {
        int id;
        char name[32]; //修改
        char phone[32]; //修改
    };
    
    void CreatFile1()
    {
        FILE* fp = fopen("写入结构体.txt", "w");
        if (fp == NULL)
        {
            perror("写入结构体.txt开启失败");
            exit(1);
        }
        struct student st[] = { 1,"lizhigang","18328746048",2,"liusi","111149223",3,"liyuqi","12345678912" };
        fwrite(st, sizeof(struct student), 3, fp);
    
        fclose(fp);
    }
    
    void ReadFile1()
    {
        FILE* ffp = fopen("写入结构体.txt", "r");
        if (ffp == NULL)
        {
            perror("写入结构体.txt开启失败");
            exit(1);
        }
        struct student st[3] = { 0 };
    
        while (1)
    
        {
            int i = fread(&st[0], sizeof(struct student), 1, ffp);
            if (i == 0)
                break;
            printf("学号:%d\t姓名:%s\t电话:%s\n", st[0].id, st[0].name, st[0].phone);
            //printf("学号:%d\t姓名:%p\t电话:%p\n", st[0].id, st[0].name, st[0].phone);
        }
    
        fclose(ffp);
    }
    
    int main(void)
    {
        //CreatFile1();
    // 这里如果在已经创建了文件的情况下 注掉CreatFile1()就不能正常运行,只有这两行都在才能正常运行
        ReadFile1();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 已采纳回答 12月19日
  • 创建了问题 9月14日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错