[VC/MFC]用fread读取dat文件中的数据,只有一部分是对的,如何解决?

边边做毕设 2015-03-18 11:06:14
将matlab文件改为C++的,放到MFC搭的程序里,读取经纬度,数据文件分别为latitude.dat和longitude.dat
原来matlab代码为

fid1= fopen('longitude.dat', 'r');
mLon=fread(fid1, [14776, 1], 'float32');
fclose(fid1);

fid1= fopen('latitude.dat', 'r');
mLat=fread(fid1, [16901, 1], 'float32');
fclose(fid1);

然后我在VC里改的是这样

FILE *pFlon=fopen("longitude.dat","r");
if(pFlon==NULL)
{
return;
}
float londata[14776];
fread(londata,sizeof(float),14776,pFlon);
fclose(pFlon);

FILE *pFlat=fopen("latitude.dat","r");
if(pFlat==NULL)
{
return ;
}
float latdata[16901];
fread(latdata,sizeof(float),16901,pFlat);
fclose(pFlat);
我在最后一句处设置断点,结果发现有问题

而且latdata数据后半部分都不对


请教各位这是为什么?改如何解决?
...全文
449 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
边边做毕设 2015-03-20
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
fread(londata,sizeof(float),14776,pFlon); lz确认文件中有14776组float数据?确认matlab的float数据长度也是4个字节?确认数据是小端数据?
我不确认,是老师给的数据和matlab程序,不过matlab程序中是那样读出来的14776组数据,我后来fopen改成rb方式,读出来的数据就是对的了,这是不是也验证了您说的这几个问题?ps前辈回复的好快!
worldy 2015-03-20
  • 打赏
  • 举报
回复
fread(londata,sizeof(float),14776,pFlon); lz确认文件中有14776组float数据?确认matlab的float数据长度也是4个字节?确认数据是小端数据?
边边做毕设 2015-03-20
  • 打赏
  • 举报
回复
谢谢各位啦!不过我新来的...不知道怎么给分啊.....
边边做毕设 2015-03-20
  • 打赏
  • 举报
回复
引用 10 楼 benny89415 的回复:
2进制打开,一字节一字节读 一般来说,读文件要用2进制读取,除非是自己临时写的配置文件。
哈哈是的!我把fopen改成“rb"方式打开,就对了!
边边做毕设 2015-03-20
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
matlab里的 [16901, 1],这个是啥意思?
是说用读取出来的数据填充[16901,1]这个矩阵,列优先。
zgl7903 2015-03-19
  • 打赏
  • 举报
回复
-1.07374e+008 是0xCCCCCCCC VC一般就是没有初始化时的状态 看看 fread 的返回值 估计没有那么多数据

float londata[14776];
memset(londata, 0, sizeof(londata));
size_t iCount = fread(londata,sizeof(float),14776,pFlon);
fclose(pFlon);
wshlwz 2015-03-19
  • 打赏
  • 举报
回复
可以通过feof判断是否已经读完
小猪飞剑 2015-03-19
  • 打赏
  • 举报
回复
2进制打开,一字节一字节读 一般来说,读文件要用2进制读取,除非是自己临时写的配置文件。
xiaohuh421 2015-03-19
  • 打赏
  • 举报
回复
fread(londata,sizeof(float),14776,pFlon); 这里不定能一次读取完, 所以你需要判断fread的返回值, 没有读取完, 需要继续读取.
worldy 2015-03-18
  • 打赏
  • 举报
回复
记事本使用unicode的格式打开看看
边边做毕设 2015-03-18
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
不知道lz的dat文件是否是文本格式,如果是,则检查文件得编码格式和你当前系统选择的编码格式是否一致,如果不一致,则需要进行格式转换 如果是数值格式,则注意字节对齐是否一致
您好,这个dat文件用记事本打开是乱码,是不是意味着它是数值格式?如果是的话,能不能进一步解释一下字节对齐?我没什么经验,谢谢啦
worldy 2015-03-18
  • 打赏
  • 举报
回复
不知道lz的dat文件是否是文本格式,如果是,则检查文件得编码格式和你当前系统选择的编码格式是否一致,如果不一致,则需要进行格式转换 如果是数值格式,则注意字节对齐是否一致
边边做毕设 2015-03-18
  • 打赏
  • 举报
回复
自己来顶一下,麻烦了解的前辈帮忙解答下~先谢过~
worldy 2015-03-18
  • 打赏
  • 举报
回复
matlab里的 [16901, 1],这个是啥意思?
边边做毕设 2015-03-18
  • 打赏
  • 举报
回复
引用 4 楼 worldy 的回复:
记事本使用unicode的格式打开看看
还是乱码
wyx100 2015-03-18
  • 打赏
  • 举报
回复
引用 4 楼 worldy 的回复:
记事本使用unicode的格式打开看看

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧