萱草C 2022-05-06 00:51 采纳率: 100%
浏览 86
已结题

用fwrite写入double数据后用fread读不出来

把menu_t的double类型数据改为int数据之后就可以正常读取了,这是不是意味着写入的时候出了问题
这是我的代码。
#include<stdio.h>
#include"CFile.h"
#include"Clist.h"
#include<string.h>
#include<stdlib.h>
void File_Userread();
int userCount=3;
int menuCount=3;
void File_Userwrite(USER_T user[]);
void File_Menuread();
void File_Menuwrite(MENU_T arr[]);

USER_T userArr[10]={
{1001,"Lily","123123",1},
{1002,"Tony","123456",2},
{1003,"Bot","123321",3}
};

MENU_T menuArr[10]={
{1001,"肉蛋葱鸡","下饭神器",6},
{1002,"不响丸","麻辣",7},
{1003,"肾炝洗鲤","好吃多一点点",8}
};
int main()
{

File_Userwrite(userArr);
File_Userread();

File_Menuwrite(menuArr);
File_Menuread();

return 0;

}

void File_Userread()
{
//1.文件打开
FILE *fp=NULL;
USER_T *puser =NULL;
LIST_T *userhead=list_init();
fp=File_open("data/user.txt");
if(NULL == fp)
{
printf("打开失败\n");
exit(0);
}
else
printf("打开成功\n");
//2.指针位置设置开头位置
rewind(fp);
puser =(USER_T *)malloc(sizeof(USER_T));
memset(puser,0,sizeof(USER_T));
//3.读取数据
while(fread(puser,sizeof(USER_T),1,fp)>0)
{
listAdd(userhead,puser);//添加到用户结构体链表中
printf("id=%d,name=%s,pwd=%s,role=%d\n",puser->id,puser->name,puser->pwd,puser->role);
}
//4.文件关闭
fclose(fp);
}

void File_Userwrite(USER_T user[])
{
int i=0;
FILE *fp=NULL;
fp=File_open("data/user.txt");
if(NULL == fp)
{
printf("打开失败\n");
exit(0);
}
else
{
printf("打开成功\n");
}
//2.文件定位
rewind(fp);
//3.文件写入
for(i=0;i<userCount;i++)
{
fwrite(&user[i],sizeof(USER_T),1,fp);
fflush(fp);
}
fclose(fp);

}

void File_Menuread()
{
//1.文件打开
FILE *Menufp=NULL;
MENU_T *pmenu =NULL;
LIST_T *menuhead=list_init();
Menufp=File_open("data/menu.txt");
if(NULL == Menufp)
{
printf("打开失败\n");
exit(0);
}
else
printf("打开成功\n");
//2.指针位置设置开头位置
rewind(Menufp);

pmenu =(MENU_T *)malloc(sizeof(MENU_T));
memset(pmenu,0,sizeof(MENU_T));
//3.读取数据
while(fread(pmenu,sizeof(MENU_T),1,Menufp)>0)
{
    listAdd(menuhead,pmenu);//添加到用户结构体链表中
    printf("id=%d,name=%s,info=%s,price=%d\n",pmenu->id,pmenu->name,pmenu->info,pmenu->price);
}
//4.文件关闭
fclose(Menufp);

}

void File_Menuwrite(MENU_T arr[])
{
int i=0;
FILE *Menufp=NULL;
Menufp=File_open("data/menu.txt");
if(NULL == Menufp)
{
printf("打开失败\n");
exit(0);
}
else
{
printf("打开成功\n");
}
//2.文件定位
rewind(Menufp);
//3.文件写入
for(i=0;i<menuCount;i++)
{
fwrite(&arr[i],sizeof(MENU_T),1,Menufp);
}
fflush(Menufp);
fclose(Menufp);

}

  • 写回答

2条回答 默认 最新

  • qllaoda 2022-05-06 07:21
    关注

    分析你的存储文件的代码可以看到,你存储的是二进制数据,并不是文本数据,虽然扩展名是 .txt。
    文件打开模式要用二进制模式,你没写模式,那默认就是文本模式,用文本模式去读取二进制数据,是会发生转义错误的。

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

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月6日

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能