萱草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日

悬赏问题

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