BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #87339同步于 2015/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]求助,关于从文件中读取信息到结构体的问题

fyghost
2015/6/1镜像同步17 回复
先上一段自己写的代码 FILE* fi; fi = fopen(szFilePath, "r"); if(fi == NULL) return false; int n = 0; while(!feof(fi) && n < 3) { for(int i = 0; i < CODENUM; i++) { fscanf(fi, "%d %f %f", &m_DicP_copy[n][i].num, &m_DicP_copy[n][i].p, &m_DicP_copy[n][i].pr); } n ++; } fclose(fi); 在这里面我先定义了一个二维的结构体数组m_DicP_copy[][],结构体的定义如下: typedef struct tagDICPLOVE { int num; float p [PDIM]; float pr[PDIM]; } DICPLOVE; 主要是想从一个文件中(路径为szFilePath)分别读取出int和两个float数组,并且存入到指定的结构体数组中,用fscanf读取的时候什么都读不出来,数组的值维持在初始化状态,这是为什么啊,求大神解答下啊
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
fyghost机器人#1 · 2015/6/1
是不是fscanf不能直接读取二进制啊,需要转换下
nuanyangyang机器人#2 · 2015/6/1
显然。fscanf是读文本格式的。 如果你真的要跨平台,你就必须要自己设计一套格式。文本格式是最简单的。但如果使用有结构的文本格式,比如JSON或者XML,会更简单。 不推荐使用二进制格式,很难处理,除非给我一个非用二进制不可的理由。
inaadversity机器人#3 · 2015/6/1
https://developers.google.com/protocol-buffers/
fyghost机器人#4 · 2015/6/1
哎,主要还是因为这是拿别人程序改的,文本文件都是现成的文件,并不希望特别大的改动。 不过我用最笨的方法读取了,用一层fread读到缓冲区,再往二维数组一个一个添加,不知道暖神有没有更好的建议 【 在 nuanyangyang 的大作中提到: 】 : 显然。fscanf是读文本格式的。 : 如果你真的要跨平台,你就必须要自己设计一套格式。文本格式是最简单的。但如果使用有结构的文本格式,比如JSON或者XML,会更简单。 : 不推荐使用二进制格式,很难处理,除非给我一个非用二进制不可的理由。
nuanyangyang机器人#5 · 2015/6/1
【 在 fyghost 的大作中提到: 】 : 哎,主要还是因为这是拿别人程序改的,文本文件都是现成的文件,并不希望特别大的改动。 : 不过我用最笨的方法读取了,用一层fread读到缓冲区,再往二维数组一个一个添加,不知道暖神有没有更好的建议 : 怀疑你这种“最笨的办法”的正确性。如果你真的要设计二进制格式,你必须考虑“字节序”(byte order)和“对齐”(alignment)。
fyghost机器人#6 · 2015/6/1
对吼,我忘了Linux下的字节序和Windows不一样 。。。。。 看样子是时候拿到Linux上面去实验了,不过我还不会写makefile。。。。 对齐的话如果没有空格或者换行是否有影响? 【 在 nuanyangyang 的大作中提到: 】 : : 怀疑你这种“最笨的办法”的正确性。如果你真的要设计二进制格式,你必须考虑“字节序”(byte order)和“对齐”(alignment)。
nuanyangyang机器人#7 · 2015/6/1
【 在 fyghost 的大作中提到: 】 : 对吼,我忘了Linux下的字节序和Windows不一样 : 。。。。。 : 看样子是时候拿到Linux上面去实验了,不过我还不会写makefile。。。。 : ................... 1. 字节序主要由cpu决定,而不是操作系统。 2. 对齐不是加空格的问题,而是一个二进制数据存储的位置(地址)是否需要是某些数的倍数。 还是用文本格式吧。
fyghost机器人#8 · 2015/6/1
网上查了下,所需要用到的系统处理器用的也是小端字节序,不用转换,噢耶,白捡了了一个小便宜 对齐的话用到的时候再慢慢调 改文件的话就没有对齐的问题了吗? 【 在 nuanyangyang 的大作中提到: 】 : : 1. 字节序主要由cpu决定,而不是操作系统。 : 2. 对齐不是加空格的问题,而是一个二进制数据存储的位置(地址)是否需要是某些数的倍数。 : ...................
nuanyangyang机器人#9 · 2015/6/1
【 在 fyghost 的大作中提到: 】 : 网上查了下,所需要用到的系统处理器用的也是小端字节序,不用转换,噢耶,白捡了了一个小便宜 : 对齐的话用到的时候再慢慢调 : 改文件的话就没有对齐的问题了吗? : ................... 无语…… 你恐怕还没查到C语言并没有规定它的数据和字节之间的对应关系吧,C语言也没有规定它的基本类型(比如int, long, double, float什么的)占几个字节,也没有规定struct的元素之间有没有padding。这种态度还是不要想着读二进制格式还能跨平台了。