从未格式化的二进制文件读取时进行逻辑值的有效性检查

时间:2019-03-01 16:22:39

标签: fortran fortran90

我使用fortran读取了未格式化的二进制检查点文件,需要检查其值的有效性。检查点的全部要点是发生了一些崩溃,并且检查点文件本身可能已损坏(例如,如果崩溃发生在写入文件期间)。

现在我的问题是:是否有一个标准程序来检查从文件读取的逻辑值是否正确存储为逻辑值。

一个简短的测试,写任何数字而不是逻辑并读取它给了我.false。值。我假设读取的每个数字都将按照类似C的规则进行转换:nr == 0->。false。 nr!= 0-> .true。但是,这无法帮助我识别逻辑是否正确编写。

我可以想象的是,首先将值读取为整数(或某种二进制值?),然后检查它们是否为0或1,指向逻辑的正确写法。

示例:

write_test.f90:

program write_test
logical,parameter :: bool=.true.
real*8,parameter :: r=5e20
open(unit=10,form='unformatted')
write(10)bool,r
close(10)
end program

read_test.f90:

program read_test
logical :: bool1
logical :: bool2
open(unit=10,form='unformatted')
read(10)bool1,bool2
write(*,*)bool1,bool2
end program

read_test.f90的输出:

T F

bool2看起来像是一个很好的逻辑,值为.false。,但它存储为实数,我想避免像其他所有可能扔在那里的数据类型那样

显然,它也不使用.true。对于非0的值。我的猜测是,存储在其中的实数的前导位为0,并且仅读取该位。

1 个答案:

答案 0 :(得分:1)

这可能是扩展注释,而不是答案:

当您假定将按照类似C的规则转换读取的每个数字时,您错了:nr == 0->。false。 nr!= 0-> .true。至少,Fortran标准的规则不能保证您的假设是正确的。这在用于表示True和False的位模式的问题上没有提及,特别是它没有强制要求它们与用于表示0和1(或1和0的位模式)相同;我永远无法获得那些认为它们是布尔值的有趣的语言。

Fortran标准所做的几乎所有保证就是,默认大小的实数,整数和逻辑在内存中占据相同的位数,并且(除非您无所事事)在不格式化写入文件时使用。这意味着除其他外,任何32位(如果是默认存储单元大小,则为64位)可以解释为实数,整数或逻辑。

某些位模式可能无法成功地解释为任何或所有这些类型,但是同样,这是低于Fortran标准运行级别的实现问题。

仅凭位就无法知道一组32位表示什么类型的值,必须在某种程度上说明如何解释二进制文件。这就是它们使它们难以携带的原因。

如果这些问题对您很重要,那么您确实必须亲自研究它们,尤其是,编译器(版本)使用什么位模式来表示逻辑值。您可以合理地期望(尽管不能保证)整数以二进制补码形式表示,而实数以IEEE形式表示。

相关问题