Fortran Coder

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

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

[复制链接]

798

帖子

2

主题

0

精华

大宗师

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

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

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

28

帖子

4

主题

0

精华

熟手

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

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, 下载次数: 216)

自己的

自己的

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

老程序结果

老程序结果

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
15#
 楼主| 发表于 2020-5-17 11:25:44 | 只看该作者
有点激动,整了快2天的时间,对Fortran理解不少,太有意思了

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
16#
 楼主| 发表于 2020-5-17 11:34:44 | 只看该作者
我把 DIMENSION WORK(300)改为INTEGER  WORK(300) 能够读入74 10 22 45但是后面小数就不行了,读的全是整数。如果WORK为REAL型,为啥不能把74当做74.0读入呢?类似C++里面的读入处理

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

17#
发表于 2020-5-17 12:49:20 | 只看该作者
evanustc 发表于 2020-5-17 11:34
我把 DIMENSION WORK(300)改为INTEGER  WORK(300) 能够读入74 10 22 45但是后面小数就不行了,读的全是整数 ...

整数和浮点数在二进制文件里表示方法不一样,不能通用,否则读出来数据是错的。
你附件那个二进制文件按6楼的方式读没问题。

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
18#
 楼主| 发表于 2020-5-17 13:42:50 | 只看该作者
necrohan 发表于 2020-5-17 12:49
整数和浮点数在二进制文件里表示方法不一样,不能通用,否则读出来数据是错的。
你附件那个二进制文件按6 ...

是的,二进制读入没有问题。我明白您的意思,只是有点疑惑的就是小工具中关于二进制代码读取的部分:
      DIMENSION WORK(1)
      OPEN(UNIT=IOPDS, FILE=FILNAM, ERR=100, STATUS='UNKNOWN',
     &     ACCESS='SEQUENTIAL', FORM='UNFORMATTED',IOSTAT=IOS)
      READ(UNIT=IOPDS,ERR=300,IOSTAT=IOS)  LENG,(WORK(I),I=1,LENG)
      CLOSE(UNIT=IOPDS, ERR=200, STATUS='KEEP',IOSTAT=IOS)
      RETURN74
WORK声明的是数组,也没有指定类型,在UBUNTU下编译后,转出的10进制文件是正确的。我推断WORK中即读入了整型也有实型,不然打印成十进制不可能对的上。这部分我在win下实现后就出现了我刚才问的问题,屏幕输出的前4个本应该是74 10 22 45却变为了神秘小数。。

798

帖子

2

主题

0

精华

大宗师

F 币
3793 元
贡献
2268 点
19#
发表于 2020-5-17 16:13:17 | 只看该作者
本帖最后由 li913 于 2020-5-17 17:51 编辑

研究了两天,发现这个代码是比较奇葩的,典型的国外开源代码风格,故意让人看不懂(也可能是代码太老了)。核心也就那么十来行。将所有数据读入数组,通过一定规则(numchk函数)判断每个数据的真实类型(real 或 integer),然后每6个数据输出一行。

[Fortran] 纯文本查看 复制代码
!判断数据是整数还是实数
subroutine numchk (ia,icode)
character aho*7
write(aho,'(i7)') ia
if(aho.eq.'*******') then
  icode = 0
else
  icode = 1
endif
end
      
program test
implicit none
integer(4) m, n, i, j, k
real,allocatable:: a(:)
real b
equivalence(b,n)
character cl*3

!读取
open(10,file='FASTLIB', ACCESS='SEQUENTIAL',FORM='UNFORMATTED')
read(10) m
allocate(a(m)) !分配空间
rewind(10)
read(10) m, a(1:m)
close(10)

!输出
open(10,file='out.txt')
k=0
do i = 1, m
  b = a(i)
  k=k+1
  if(mod(k,6)==0) then !每6个数据输出一行
    cl = 'yes'
  else
    cl = 'no'
  end if
  call numchk(n,j) !判断数据是整数还是实数
  if(j==0) then
    write(10,'(1pe12.5)', advance=cl) b
  else
    write(10,'(4x,i7,1x)',advance=cl) n
  end if
end do
end

QQ截图20200517160850.png (106.58 KB, 下载次数: 298)

QQ截图20200517160850.png

1.png (81.34 KB, 下载次数: 277)

1.png

28

帖子

4

主题

0

精华

熟手

F 币
134 元
贡献
72 点
20#
 楼主| 发表于 2020-5-17 19:57:25 | 只看该作者
本帖最后由 evanustc 于 2020-5-17 20:04 编辑
li913 发表于 2020-5-17 16:13
研究了两天,发现这个代码是比较奇葩的,典型的国外开源代码风格,故意让人看不懂(也可能是代码太老了)。 ...

李老师,请收下我的膝盖orz....太厉害了。在结合工具代码的基础上,阅读您的代码,我明白了意思。在您的代码里,有一项我不太明白原理,就是a(1)读进来的时候还是REAL型的小数,但是在最后的循环中,使用了 b=a(1),然后整形n就成了74了。。。  equivalence(b,n)这一句,实型b和整型n共用同一块内存地址,是由于整型和实型的原因导致取同一块地址里的值时导致不一样的吗?为啥不用n=b转换呢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-27 12:41

Powered by Tencent X3.4

© 2013-2024 Tencent

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