鱼C论坛

 找回密码
 立即注册
查看: 3024|回复: 8

从文件中读取结构体数据出错!!!!

[复制链接]
发表于 2016-9-7 21:49:37 From FishC Mobile | 显示全部楼层 |阅读模式
50鱼币
  一个通讯录软件!首先输入信息!结构体为{char  name[15],char   celephone[22],char   QQ[20]}per[500];    录入后进行输出显示很正常!并将其保存在文本文件中!之后重启软件再导出!通过调试查看内存中的数据也是很正常fread(&per[num],sizeof(struct Person),1,fp)!然后问题就来了~per[num].name的指向的数据不对后面的也不对????

最佳答案

查看完整内容

1.fread(&per[num],sizeof(struct Person),1,fp)里面的struct Person是你说的结构体{char name[15],char celephone[22],char QQ[20]}吗?如果是,可能是文件IO出错了: 文件IO最好统一IO格式:要么都以支持文本文件读写的IO函数(譬如fprintf(),fscanf())进行读写,要么用二进制IO函数(譬如fread(),fwrite())进行读写。两者对内存字节的处理是有区别的(前者有基于特定系统的字符映射,后者是处理原始二进制数据)如果混 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-7 21:49:38 | 显示全部楼层
1.fread(&per[num],sizeof(struct Person),1,fp)里面的struct Person是你说的结构体{char  name[15],char   celephone[22],char   QQ[20]}吗?如果是,可能是文件IO出错了:
文件IO最好统一IO格式:要么都以支持文本文件读写的IO函数(譬如fprintf(),fscanf())进行读写,要么用二进制IO函数(譬如fread(),fwrite())进行读写。两者对内存字节的处理是有区别的(前者有基于特定系统的字符映射,后者是处理原始二进制数据)如果混合使用,自己得做好可能出现IO错误的心理准备和后继处理。
2.另一个可能感觉可能性小:字符串的size超过了字符数组的预留空间,编译器无法在字符数组末位置追加空字符'\0',使得打印per[num].name时,继续打印了后续字符。
没有源码,不明白具体原因,个人猜测,请不要喷。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-9-7 21:50:20 From FishC Mobile | 显示全部楼层
不好意思手机打的没有看到专门插代码的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-7 22:21:38 | 显示全部楼层
fread是以2进制的方式读取的;那么你保存文件是时候是以2进制方式还是ascii方式呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-9-8 17:41:33 From FishC Mobile | 显示全部楼层
仰望天上的光 发表于 2016-9-7 22:21
fread是以2进制的方式读取的;那么你保存文件是时候是以2进制方式还是ascii方式呢?

我保存时用的是fprintf(),,,,顺便再说明一下!!输出错误的情况不是乱码!!是结构体的成员读取的不是他应该对应的内存单元!读取到per[num]中时都是正确的!!可是打印出来per[num].name直接把整个结构体输出了!明明它只有15字节!!per[num].celephone直接把从第16字节开始的数据全部输出了!以此类推!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-9-8 19:31:56 From FishC Mobile | 显示全部楼层
mingcxx 发表于 2016-9-8 19:04
1.fread(&per[num],sizeof(struct Person),1,fp)里面的struct Person是你说的结构体{char  name[15],char   ...

谢谢!!对于①我不是很了解!我用你的方法②导出文件时单独加了‘\0’已经可以了!有点奇怪的事是之前没加时导出的文件可以直接打开看!现在可以通过程序输出了却直接打开是乱码!?(谢谢咯)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-8 19:50:53 From FishC Mobile | 显示全部楼层
本帖最后由 mingcxx 于 2016-9-8 19:57 编辑

这就合理了。要对原始数据进行读写就用二进制io.你说的打开乱码应该是用记事本打开的吧,这很正常。记事本恰恰就是把所有数据按照文本文件,这里就是windows系统的anscii编码方式进行了解读,而咱们是写的二进制文件,它按照文本文件方式自然解读不出来了。
手残,拿的手机打字没写完就点错回复了,抱歉抱歉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-21 22:33:54 | 显示全部楼层
没看明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-2 08:49:38 | 显示全部楼层
格式问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 02:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表