我正在努力将一小段 Fortran 代码翻译为 C。我有一个以二进制格式编写的文件和一个读取该格式的 Fortran 程序。我的目标是拥有一个能够读取相同格式的 C 程序。我对 Fortran 完全陌生,并且没有格式的原始规范。因此,这是一种逆向工程过程。
filename = 'file'
integer :: status
integer, parameter :: di=selected_int_kind(9)
integer(di) :: nn
OPEN(11,file = filename, status = 'old', action = 'read', form = 'unformatted', iostat = status)
if(status /= 0) then
write(*,*) 'FILE ERROR: '//filename
stop
endif
read(11) nn
CLOSE(11)
真正让我困惑的一件事是 selected_int_kind()
语句。它到底有什么作用? C 中的等价物是什么?
实际上,我的第一次翻译尝试与@JohnBode 的答案几乎相同,但没有成功。它读取的值完全不正确。
经过几次尝试,我找到了一个可行的解决方案,但是,我不明白为什么会这样。由于某种原因,正确的值被写入第 5-8 个字节。因此,我可以读取两个 int
值(其中第二个是正确的值),也可以读取一个 long
值,然后右移 32位。知道为什么 Fortran 可以如此轻松地检索正确的值吗?
最佳答案
Fortran 中的类型有 KIND,因为相同的类型(在您的例子中为 INTEGER)可能有不同的“风格”(有点像 C 中的短、长、有符号、无符号等)。这些类型是整数:请参阅列表 here例如。您的表达式 selected_int_kind(9)
的意思是:可以包含 -1e9 和 1e9 之间的值的最小整数种类的种类号是多少(请参阅解释 here )。
在 C 中,我猜 signed int
应该没问题,因为即使 4 个字节(32 位)也会从 -2^31
到 2^31- 1
比要求的稍宽。
关于c - 读取未格式化文件的 Fortran 到 C 的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322254/