中易网

C语言中,用fwrite写入一些信息支文本文档中,为什么会是乱码

答案:2  悬赏:0  
解决时间 2021-03-08 00:13
C语言中,用fwrite写入一些信息支文本文档中,为什么会是乱码
最佳答案
如下定义:
struct apparatus_info{ //定义仪器设备信息结构体
char number[10]; //设备编号
char name[20]; //设备名称
double price; //设备单价
char inDate[20]; //购进的时间
char producter[20]; //生产厂家
int count; //购进的数量
char usability[INITIAL_SIZE]; //设备的可用性
};
问题有好几处,也有几种方法解决

1,
分配给records[numApps]的内存空间虽然是给它使用
但是它没有初始化,里面是有一堆乱七八糟的数据

之后你保存到records[numApps]里的数据
如果没有用完numApps空间
尾巴还是有一堆乱七八糟的数据

所以不干净

如果records[numApps]是字符串
搬进去住前先把房间打扫一下,用
memset(records,0,numApps);
就是让它的存储空间全部写0

但是你的records[numApps]是结构体数组
所以需要另外保证每组数据的每个成员都有写值

2,
你用的是gets(str);
输入的是字符串,回车结束
str是10,而records得成员有10,20,这就有隐患

3,
atof和atoi函数使用的时候要小心
对于atoi和atof,
有新的函数可以替代
atoi可以用strtol替代,
而atof可以用strtod等替代
strtol比atoi安全,
records[numApps].price=(float)atof(str);
改成
records[numApps].price=(double)atof(str);

4,
输入records[numApps]成员数据的时候不如用
scanf("%d%f%s",&......);
格式化输入安全

5,
fp=fopen("app_info.txt","w");
是以文本方式写入文件的
fwrite(&records[i],sizeof(AppInfo),1,fp);
验证app_info.txt是文本还是二进制
fwrite的第一个参数是字符串,是文本
fwrite的第一个参数是int或float,是二进制
你的参数是结构体,数据类型复杂,app_info.txt是二进制
具体情况要具体分析

还有fwrite输出结构体数组数据,一句话多痛快
但是你要阅读,或者用程序读出来的时候你会感觉登山一样难

所以用fprintf格式化输出安全
for(i=0;i {
fprintf(fp,"=============================\n");
fprintf(fp,"%s\n",&records[i].number);
fprintf(fp,"%s\n",&records[i].name);
fprintf(fp,"%f\n",&records[i].price);
fprintf(fp,"%s\n",&records[i].inDate);
fprintf(fp,"%s\n",&records[i].producter);
fprintf(fp,"%d\n",&records[i].count);
fprintf(fp,"%s\n",&records[i].usability);
}

6,
真要用fwrite
建议如下
char outbuf[max_buf]; //max_buf=1000或更大,保证够用
char tempbuf[20];
memset(outbuf,0,max_buf);

for(i=0;i {
sprintf(tempbuf,"%s\n",&records[i].number);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].name);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%f\n",records[i].price);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].inDate);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].producter);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%d\n",records[i].count);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].usability);
strcat(outbuf,tempbuf);
}

if(fwrite(outbuf,strlen(outbuf),1,fp)!=1)
{
printf("写入错误!\n");
}
看,还是要格式化输出tempbuf,outbuf过渡一下
让fwrite写的是字符串

7,
输出前可以用下面printf显示来看看
学会debug
for(i=0;i {
printf("%s\n",&records[i].number);
printf("%s\n",&records[i].name);
printf("%f\n",records[i].price);
printf("%s\n",&records[i].inDate);
printf("%s\n",&records[i].producter);
printf("%d\n",records[i].count);
printf("%s\n",&records[i].usability);
全部回答
这个函数以二进制形式对文件进行操作 按数据定义结构的写入保持数据结构的长度,对于数值类型,再用文本方式打开时表现为 乱码。例如float a=12345.67,写入文件后为4个字节,打开后不是文本表示的8个字节。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
跟女友闹矛盾,想写封幽默点的道歉信
宏乐录音棚如何把自己录制的声音修改的低沉些
求藏头诗,可以不用太复杂,谢谢!好的加分。
华丽装潢商店怎么去啊,有知道地址的么
微软 surface pro 3键盘盖怎么用
作文:我们的运动会 求开头、结尾(表太短)
定南服务区-超市这个地址在什么地方,我要处
莱山一中98届高一.六班班主任
二进制数1111111111(十个1哦) 请把他转换成
揽秀园西街地址有知道的么?有点事想过去
plastazote是什么
什么是专销
佳康集团肉店NO.B.00011地址在什么地方,想过
形容非常疼痛的成语有哪些?
微信绑定了QQ邮箱之后被盗了,那QQ邮件会不会
推荐资讯
鸡眼和刺窝是同一种病吗
全民k歌不是qq,微信好友能听到吗
大众捷达变速箱油多久需要更换?
猫上的lin灯不亮是什么原因
一起长大上学又已婚男女相互欣赏
骗子为什么问我银行卡号还问我余额还让我开通
2000左右耳机推荐
英雄联盟排位段位会掉吗 英雄联盟排位多久不
求黑帮老大陈斌资料,谢谢
什么是13个月年薪
春语作文我想知道这个在什么地方
draw和coat的读音一样吗
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?