李星 发表于 2016-9-7 21:49:37

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

一个通讯录软件!首先输入信息!结构体为{charname,char   celephone,char   QQ}per;    录入后进行输出显示很正常!并将其保存在文本文件中!之后重启软件再导出!通过调试查看内存中的数据也是很正常fread(&per,sizeof(struct Person),1,fp)!然后问题就来了~per.name的指向的数据不对后面的也不对????{:10_266:}{:10_266:}

mingcxx 发表于 2016-9-7 21:49:38

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

李星 发表于 2016-9-7 21:50:20

不好意思手机打的没有看到专门插代码的

仰望天上的光 发表于 2016-9-7 22:21:38

fread是以2进制的方式读取的;那么你保存文件是时候是以2进制方式还是ascii方式呢?

李星 发表于 2016-9-8 17:41:33

仰望天上的光 发表于 2016-9-7 22:21
fread是以2进制的方式读取的;那么你保存文件是时候是以2进制方式还是ascii方式呢?

我保存时用的是fprintf(),,,,顺便再说明一下!!输出错误的情况不是乱码!!是结构体的成员读取的不是他应该对应的内存单元!读取到per中时都是正确的!!可是打印出来per.name直接把整个结构体输出了!明明它只有15字节!!per.celephone直接把从第16字节开始的数据全部输出了!以此类推!!

李星 发表于 2016-9-8 19:31:56

mingcxx 发表于 2016-9-8 19:04
1.fread(&per,sizeof(struct Person),1,fp)里面的struct Person是你说的结构体{charname,char   ...

谢谢!!对于①我不是很了解!我用你的方法②导出文件时单独加了‘\0’已经可以了!有点奇怪的事是之前没加时导出的文件可以直接打开看!现在可以通过程序输出了却直接打开是乱码!?(谢谢咯)

mingcxx 发表于 2016-9-8 19:50:53

本帖最后由 mingcxx 于 2016-9-8 19:57 编辑

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

lili200238 发表于 2016-9-21 22:33:54

没看明白{:10_250:}

lili200238 发表于 2016-10-2 08:49:38

格式问题吗?
页: [1]
查看完整版本: 从文件中读取结构体数据出错!!!!