Fortran Coder

楼主: evanustc
打印 上一主题 下一主题

[文件读写] 关于二进制文件的读入问题?

[复制链接]

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
14#
 楼主| 发表于 2020-5-17 11:22:55 | 只看该作者
li913 发表于 2020-5-17 09:19
你静态编译一个小工具的可执行,附带二进制文件,以及使用方法, 一起上传。
之前的二进制文件肯定是有问题 ...

李老师,问题似乎解决部分了。如您说,二进制文件有问题,我从服务器重新下载了FASTLIB后,重新用自己写的F77:
leng为153,后面的work读入了153个数据,但是74 10 22 45这4个读入后显示的为小数*E-43这种,是因为我声明的是REAL WORK吧,但是我按照老程序把WOK改写为DIMENSION后,结果不变。
DIMENSION WORK(1)
OPEN(UNIT=IOPDS,FILE=FILNAM(1:LNFILE),ERR=100, STATUS='UNKNOWN',
     &     ACCESS='SEQUENTIAL', FORM='UNFORMATTED',IOSTAT=IOS)
                  ENDIF
       READ(UNIT=IOPDS,ERR=300,IOSTAT=IOS)  LNOW,(WORK(I),I=1,LNOW)  
然后我重新运行老程序,得到结果如下,由于WORK(1)读入的居然是1个值,和我自己写的读入后work(1)相同,这种work(1)的声明方式,并没有预想的读入153个数据,然后前面4个数据也非整形我想要的,这个我该如何解决呢?似乎小程序的运行暂时可以放下了。

123.jpg (288.75 KB, 下载次数: 223)

自己的

自己的

345.jpg (143.95 KB, 下载次数: 200)

老程序结果

老程序结果

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
13#
 楼主| 发表于 2020-5-17 10:49:58 | 只看该作者
还有一个所有二进制合并成的一个十进制文件,50多M,上传不上来,已在说明中截图示意。

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
12#
 楼主| 发表于 2020-5-17 10:48:44 | 只看该作者
li913 发表于 2020-5-17 09:19
你静态编译一个小工具的可执行,附带二进制文件,以及使用方法, 一起上传。
之前的二进制文件肯定是有问题 ...

李老师,感谢!已上传!

二进制转十进制工具.rar

21.37 KB, 下载次数: 4

使用说明1.rar

473.24 KB, 下载次数: 3

使用说明2.rar

874.45 KB, 下载次数: 132

801

帖子

2

主题

0

精华

大宗师

F 币
3804 元
贡献
2273 点
11#
发表于 2020-5-17 09:19:21 | 只看该作者
本帖最后由 li913 于 2020-5-17 09:40 编辑

你静态编译一个小工具的可执行,附带二进制文件,以及使用方法, 一起上传。
之前的二进制文件肯定是有问题的。

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
10#
 楼主| 发表于 2020-5-16 21:10:55 | 只看该作者
li913 发表于 2020-5-16 12:53
1、LNOW是什么类型,因为前面也没有显示声明.
如果代码中没有implicit none, 默认用I-N规则解析变量类型, ...

我晚上用您的这个程序改写为77后,又读了其他二进制的文件,和小工具在UBUNTU下运行转换出来的结果对比,区别:1、用小工具转换二进制和十进制互转可以对上。
1、自己转的,相比于十进制文件,我的前面总是多个0并且文件最后少一个数据(和您运行的结果得到的结论一致,但是相同的二进制文件用自带工具转十进制就没问题)。
2、我上传了转10进制的小工具,和CSH执行脚本。

希望得到您的帮助,可能会麻烦您,我可以给您付一点费用或者我捐赠下论坛发展,虽然我还是个学生

codesource.zip

89.49 KB, 下载次数: 61

二进制转十进制小工具,UBUNTU下编译可直接运行

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

9#
发表于 2020-5-16 19:56:54 | 只看该作者
要先把 LNOW 读对才能解决后面的问题

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
8#
 楼主| 发表于 2020-5-16 19:24:53 | 只看该作者
本帖最后由 evanustc 于 2020-5-16 19:26 编辑
li913 发表于 2020-5-16 12:53
1、LNOW是什么类型,因为前面也没有显示声明.
如果代码中没有implicit none, 默认用I-N规则解析变量类型, ...

李老师,谢谢您的指点,我下午又补习了下这块的知识,收获颇多。
对于您的这个截图,我按照您的代码试了下,和您的结果吻合。只是我还有几个问题:
1、我原来贴的图中(F77远古代码),我在win下编译没问题,跟到READ(UNIT=IOPDS,ERR=300,IOSTAT=IOS)  LNOW,(WORK(I),I=1,LNOW)后,变量显示LNOW是0,WORK(I)为0,感觉就是WORK没有读进去, 不知道是什么原因,在UBUNTU下编译后,程序是能够正常计算有结果的,也就是说WORK里面读入了数据,我想不明白,路径也没有问题,文件也是同一个二进制文件。
2、您写的这个代码里,第一输出的是0,这个对应10进制文件的哪一个呢?
3、二进制和十进制文件都是通过小程序转换出来的,然后通过VM从UBUNTU拷贝到WIN下,应该是没问题的,而且用二进制转十进制也是能对上的。
我下午正在琢磨小程序,里面关于PDS的读入是这样的,如图,似乎和主程序的套路是一样的,估计我跟到这边,变量显示还是会有同样的问题。

小程序中PDS读写函数.png (82.96 KB, 下载次数: 362)

小程序中PDS读写函数.png

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
7#
 楼主| 发表于 2020-5-16 19:08:15 | 只看该作者
necrohan 发表于 2020-5-16 12:12
没有声明默认是IN规则,LNOW是整数。
读入那里应该是先读入整数LNOW,然后读入数组WORK,WORK有LNOW个数据 ...

谢谢!应该是这样执行的!

801

帖子

2

主题

0

精华

大宗师

F 币
3804 元
贡献
2273 点
6#
发表于 2020-5-16 12:53:30 | 只看该作者
本帖最后由 li913 于 2020-5-16 13:05 编辑

1、LNOW是什么类型,因为前面也没有显示声明.
如果代码中没有implicit none, 默认用I-N规则解析变量类型,那么就是整型。
2、WORK在前面已经申明是WORK(1)
work是形参数组,其长度并不是1,详细介绍见《三种数组传递方式》http://fcode.cn/guide-103-1.html
这里(WORK(I),I=1,LNOW)是一个隐循环,把Lnow个数据读入work中。
3、读取结果不符合预期,检查文件内容是否正确,文件路径是否正确。
4、 二进制文件,必须知道其存储格式才能读取。二进制和十进制文件转换小工具,这个工具的源代码是重要的线索。
5、你给的这个二进制文件可能有问题,缺少最后一个数据。

1.png (104.24 KB, 下载次数: 388)

1.png

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

5#
发表于 2020-5-16 12:12:08 | 只看该作者
没有声明默认是IN规则,LNOW是整数。
读入那里应该是先读入整数LNOW,然后读入数组WORK,WORK有LNOW个数据,默认是浮点数。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-18 23:14

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表