标题:如何读取二进制文件的内容,并转换?
只看楼主
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
回复 20楼 sh600839
网上有不少高手已经实现了bintoc和ctobin

记得在行者孙百度的博客上还看见过

个性太多,无法显示
2012-05-12 14:25
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 14:20:41的发言:

共 32 个字节,每4个字节表示一个字段么 ?
我按每4个字节一次读取
结果如下
20120511
728
733
726
729
1259584443
1326338
0
估计后面3个字段读取有问题
1326338 是成交量,正确的结果
1259584443 是成交金额(转换不正确),这是个浮点数,正确的值应该是967万。

浮点数怎么转?一点不懂

bintoc()在vfp5.0也有,但是没看到参数说明。

谢谢论坛里的朋友。
2012-05-12 14:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
不要看代码量大就以为复杂、笨,要看的是程序执行的实际效率,不是语句越短越好的。

授人以渔,不授人以鱼。
2012-05-12 14:35
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
以下是引用sh600839在2012-5-12 14:26:06的发言:


bintoc()在vfp5.0也有,但是没看到参数说明。
有么?

这个真不知道

个性太多,无法显示
2012-05-12 14:52
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
得分:0 
如果真有ctobin这个函数,并且可用
也不用拘泥于使用Fopen和fRead
你看看,这样用也挺好
Clear
lcFileString = Filetostr('sh600004.day')
?Ctobin(Substr(lcFileString,1,4),'4rs')
?Ctobin(Substr(lcFileString,5,4),'4rs')
?Ctobin(Substr(lcFileString,9,4),'4rs')
?Ctobin(Substr(lcFileString,13,4),'4rs')
?Ctobin(Substr(lcFileString,17,4),'4rs')
?Ctobin(Substr(lcFileString,21,4),'4rs')
......

个性太多,无法显示
2012-05-12 14:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用sh600839在2012-5-12 14:21:53的发言:

1楼代码的确可以,但是我感觉太笨了。这是股票行情数据,应该读取很快的。

my = Fopen("sh600004.day")
lcBinary =Fread(my,4)
?lcBinary
? Ctobin(lcBinary,'4rs')   &&这个感觉不错,但是我的vfp5.0不能用。
这个函数内部的代码就是你1楼那个,只是封装成函数而已。

授人以渔,不授人以鱼。
2012-05-12 15:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你的数据是下面这些内容是吧?

授人以渔,不授人以鱼。
2012-05-12 15:38
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用taohua300在2012-5-12 14:58:08的发言:

如果真有ctobin这个函数,并且可用
也不用拘泥于使用Fopen和fRead
你看看,这样用也挺好
Clear
lcFileString = Filetostr('sh600004.day')
?Ctobin(Substr(lcFileString,1,4),'4rs')
?Ctobin(Substr(lcFileString,5,4),'4rs')
?Ctobin(Substr(lcFileString,9,4),'4rs')
?Ctobin(Substr(lcFileString,13,4),'4rs')
?Ctobin(Substr(lcFileString,17,4),'4rs')
?Ctobin(Substr(lcFileString,21,4),'4rs')
......

filetostr()在vfp5.0里没有,sh600004.day可以有几年的数据。

现在剩下4个字节浮点数怎么读出来?见二楼说明
2012-05-12 15:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 


程序代码:
#include <cstdio>
#include <conio.h>

struct DATA
{
    int date;        // 日期
    int open;        // 开盘
    int max;        // 最高
    int min;        // 最低
    int close;        // 收盘
    float value;    // 成交金额   (这个是浮点数,怎么转换?)
    int quantity;    // 成交量
    int reserve;    // 保留
};

void wmain(void)
{
    FILE* file;
    if (fopen_s(&file, "E:\\sh600004.day", "rb") != 0)
    {
        return;
    }
    DATA data;
    fread(&data, sizeof(data), 1, file);
    fclose(file);
    printf_s("日期:%d\n", data.date);
    printf_s("开盘:%d\n", data.open);
    printf_s("最高:%d\n", data.max);
    printf_s("最低:%d\n", data.min);
    printf_s("收盘:%d\n", data.close);
    printf_s("成交金额:%.4f\n", data.value);
    printf_s("成交量:%d\n", data.quantity);
    _getch();
}


[ 本帖最后由 TonyDeng 于 2012-5-12 15:51 编辑 ]

授人以渔,不授人以鱼。
2012-05-12 15:46
sh600839
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2005-8-30
得分:0 
以下是引用TonyDeng在2012-5-12 15:38:57的发言:

你的数据是下面这些内容是吧?
是的,其中最大的那个是浮点数值,所以结果不对,应该是967万。
怎样读取浮点数啊????


附件是半年的资料。我一次读取32个字节,转换后写成txt文件,一直循环到文件尾就可以了。
sh600005.rar (4 KB)


我还是不明白:
fread()读取的值是字符型的,处理二进制数值肯定慢了。
我能不能直接从文件里读取成数值型(10进制或者16进制)????


tonydeng斑竹,你上面是用C语言编写的?用VFP行不行?


[ 本帖最后由 sh600839 于 2012-5-12 15:55 编辑 ]
2012-05-12 15:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-367387-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044279 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved