c - 读取未格式化文件的 Fortran 到 C 的翻译

标签 c types fortran

我正在努力将一小段 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^312^31- 1 比要求的稍宽。

关于c - 读取未格式化文件的 Fortran 到 C 的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322254/

相关文章:

fortran - 如何在FORTRAN中排序intent(in)、intent(out)和intent(inout)

c - 为什么在下一个代码中 c = 1?

c - 如何避免按 Enter 和 getchar() 只读取单个字符?

c - 赋值使指针来自整数,无需在结构中进行强制转换

javascript - 为什么 JavaScript 在连接时优先转换为字符串,而在比较时优先转换为数字?

c# - 在 C# 中使用 F# 类型

Fortran 95 : super large numbers for prime test

algorithm - Matlab FFT 和 Fortran Rosetta 代码 FFT 的差异

c - 未初始化(排队)就使用的变量

Oracle %TYPE : when one var, 两个表,如何定义?