返回信息流先上一段自己写的代码
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读取的时候什么都读不出来,数组的值维持在初始化状态,这是为什么啊,求大神解答下啊
这是一条镜像帖。来源:北邮人论坛 / cpp / #87339同步于 2015/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]求助,关于从文件中读取信息到结构体的问题
fyghost
2015/6/1镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
显然。fscanf是读文本格式的。
如果你真的要跨平台,你就必须要自己设计一套格式。文本格式是最简单的。但如果使用有结构的文本格式,比如JSON或者XML,会更简单。
不推荐使用二进制格式,很难处理,除非给我一个非用二进制不可的理由。
哎,主要还是因为这是拿别人程序改的,文本文件都是现成的文件,并不希望特别大的改动。
不过我用最笨的方法读取了,用一层fread读到缓冲区,再往二维数组一个一个添加,不知道暖神有没有更好的建议
【 在 nuanyangyang 的大作中提到: 】
: 显然。fscanf是读文本格式的。
: 如果你真的要跨平台,你就必须要自己设计一套格式。文本格式是最简单的。但如果使用有结构的文本格式,比如JSON或者XML,会更简单。
: 不推荐使用二进制格式,很难处理,除非给我一个非用二进制不可的理由。
【 在 fyghost 的大作中提到: 】
: 哎,主要还是因为这是拿别人程序改的,文本文件都是现成的文件,并不希望特别大的改动。
: 不过我用最笨的方法读取了,用一层fread读到缓冲区,再往二维数组一个一个添加,不知道暖神有没有更好的建议
:
怀疑你这种“最笨的办法”的正确性。如果你真的要设计二进制格式,你必须考虑“字节序”(byte order)和“对齐”(alignment)。
对吼,我忘了Linux下的字节序和Windows不一样
。。。。。
看样子是时候拿到Linux上面去实验了,不过我还不会写makefile。。。。
对齐的话如果没有空格或者换行是否有影响?
【 在 nuanyangyang 的大作中提到: 】
:
: 怀疑你这种“最笨的办法”的正确性。如果你真的要设计二进制格式,你必须考虑“字节序”(byte order)和“对齐”(alignment)。
【 在 fyghost 的大作中提到: 】
: 对吼,我忘了Linux下的字节序和Windows不一样
: 。。。。。
: 看样子是时候拿到Linux上面去实验了,不过我还不会写makefile。。。。
: ...................
1. 字节序主要由cpu决定,而不是操作系统。
2. 对齐不是加空格的问题,而是一个二进制数据存储的位置(地址)是否需要是某些数的倍数。
还是用文本格式吧。
网上查了下,所需要用到的系统处理器用的也是小端字节序,不用转换,噢耶,白捡了了一个小便宜
对齐的话用到的时候再慢慢调
改文件的话就没有对齐的问题了吗?
【 在 nuanyangyang 的大作中提到: 】
:
: 1. 字节序主要由cpu决定,而不是操作系统。
: 2. 对齐不是加空格的问题,而是一个二进制数据存储的位置(地址)是否需要是某些数的倍数。
: ...................
【 在 fyghost 的大作中提到: 】
: 网上查了下,所需要用到的系统处理器用的也是小端字节序,不用转换,噢耶,白捡了了一个小便宜
: 对齐的话用到的时候再慢慢调
: 改文件的话就没有对齐的问题了吗?
: ...................
无语……
你恐怕还没查到C语言并没有规定它的数据和字节之间的对应关系吧,C语言也没有规定它的基本类型(比如int, long, double, float什么的)占几个字节,也没有规定struct的元素之间有没有padding。这种态度还是不要想着读二进制格式还能跨平台了。