m0_61474533 2022-12-25 00:55 采纳率: 100%
浏览 58
已结题

使用fwrite()函数和fread()函数发生乱码问题

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

我做了一个基于哈希表的身份证查询系统,运行程序想把输入的信息写入文件中

void Save(IDLnode*& L)
{
    FILE* fp = fopen("D:\\IDcardSearchSystem.txt", "w");//打开文件
    if (fp == NULL)
    {
        perror("打开文件失败\n");
        system("pause");
        system("cls");
        return;
    }
    IDLnode* p = L;
    while (p != NULL)
    {
        fwrite(&p, sizeof(IDLnode),1, fp);
        p = p->next;
    }
    fclose(fp);    //关闭文件
    printf("保存成功!\n");
}
void Load(IDLnode*& L)
{
    FILE* fp = fopen("D:\\IDcardSearchSystem.txt", "r");//打开文件

    if (fp == NULL)
    {
        perror("\n打开文件失败.\n");
        return;
    }

    IDLnode p;
    while (fread(&p, sizeof(IDLnode),1, fp))
    {
        //创建新节点
        IDLnode* pNewNode = (IDLnode*)malloc(sizeof(IDLnode));

        pNewNode->next = NULL;

        //memcpy(pNewNode, &stu, sizeof(IDLnode));

        if (pNewNode != NULL)
        {
            strcpy(pNewNode->ID, p.ID);
            strcpy(pNewNode->Name, p.Name);
            strcpy(pNewNode->Address, p.Address);
            pNewNode->next = L;
            L = pNewNode;
        }

    }

    fclose(fp);

    printf("\n读取成功!\n");

    system("pause");
    system("cls");
}
遇到的现象和发生背景,请写出第一个错误信息

但是当我重新运行程序后,读取信息并将读取的信息打印在屏幕上发现是乱码,而非我之前填入的信息,这是为什么啊

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

以下是部分代码

#define HashTableLength 50        //哈希表长度
#define IdLength 20        //身份证号长度
#define Prime 47    //质数
#define NameLength 30
#define AddressLength 50

//身份证单链表
typedef struct IDLnode
{
    char ID[IdLength];        //身份证号
    char Name[NameLength];            //姓名
    char Address[AddressLength];        //地址
    struct IDLnode* next;
}IDLnode;

//身份证号哈希表
typedef struct IDHashTable
{
    char HI_ID[IdLength];
    char HI_Name[NameLength];
    char HI_Address[AddressLength];
    int state;
}IDHashTable;

//姓名哈希表
typedef struct NameHashTable
{
    char HN_ID[IdLength];
    char HN_Name[NameLength];
    char HN_Address[AddressLength];
    int state;
}NameHashTable;
bool Insert(IDLnode*& L, IDHashTable*& IH, NameHashTable*& NH, const char* id, const char* name, const char* address)
{
    //头插添加进链表
    IDLnode* p = (IDLnode*)malloc(sizeof(IDLnode));
    if (p != NULL)
    {
        strcpy(p->ID, id);
        strcpy(p->Name, name);
        strcpy(p->Address, address);
        p->next = L;//->next;
        L = p;
    }
    const char temp[1] = { '\0' };
    //用哈希函数抽象出关键字放入哈希表中
    int namekey = HashName(name);        //获取关键字
    int idkey = HashID(id);
    //放入身份证号哈希表中
    while (IH[idkey].state == 1 && strcmp(IH[idkey].HI_ID, temp) != 0)    //线性探测再散列法,用state判断是否冲突,当state=1为冲突,向后存放关键字
        idkey++;
    strcpy(IH[idkey].HI_ID, id);
    strcpy(IH[idkey].HI_Name, name);
    strcpy(IH[idkey].HI_Address, address);
    IH[idkey].state = 1;
        
    //放入姓名哈希表中
    while (NH[namekey].state == 1 && strcmp(NH[namekey].HN_ID, temp) != 0)
        namekey++;
    strcpy(NH[namekey].HN_ID, id);
    strcpy(NH[namekey].HN_Name, name);
    strcpy(NH[namekey].HN_Address, address);
    NH[namekey].state = 1;

    return true;
}
运行结果及详细报错内容

img

img

img

img

img

  • 写回答

3条回答 默认 最新

  • |__WhoAmI__| 2022-12-25 12:43
    关注

    在保存和加载时使用的是二进制文件,这是因为在 Save 函数中使用了 fwrite,而在 Load 函数中使用了 fread。

    在这种情况下,应该将文件以二进制格式打开,而不是使用文本模式。在 Save 函数中,应使用 "wb" 模式打开文件,而在 Load 函数中,应使用 "rb" 模式打开文件。

    在 Load 函数中,需要将新节点的 next 指针设置为 NULL,否则将在读取新节点时可能遇到问题。

    如果希望保留原来的信息,并在文件的末尾添加新的信息,则应在 Save 函数中使用 "a" 模式打开文件。

    在使用二进制文件时,请确保结构体中没有任何动态分配的内存,因为这可能会导致问题。例如,如果结构体中有指针字段,则可能需要编写自己的读写函数来处理这些字段。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月2日
  • 已采纳回答 12月25日
  • 修改了问题 12月25日
  • 创建了问题 12月25日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加