有效性 - 从无格式二进制文件读取时检查逻辑值

问题描述 投票:0回答:1

我用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

bool2looks好像它是一个很好的逻辑与值.false。,但它存储为一个真实的,我想避免以及可能被抛出的所有其他数据类型。

显然它也没有使用.true。对于0以外的值,我的猜测是存储在那里的实数的前导位为0,它只读取这个位。

fortran fortran90
1个回答
1
投票

这可能是一个扩展的评论而不是答案:

如果您假设读取的每个数字都将按照类似C的规则进行转换,那么您错了:nr == 0 - > .false。 nr!= 0 - > .true。或者至少,您的假设不能保证符合Fortran标准的规则。对于用于表示True和False的位模式的问题,这是无声的,特别是它并不强制它们应该与用于表示0和1的位模式相同(或者1和0 - 我永远不会得到挂起那些认为那些是布尔值的有趣语言)。

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

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

从单独的位来看,不可能知道一组32位代表什么类型的值,必须有一个如何解释二进制文件的描述。这就是使它们相当不可移植的原因。

如果这些问题对您很重要,您必须自己调查它们,特别是您的编译器(版本)用来表示逻辑值的位模式。您可以合理地期望(虽然这不能保证)整数以二进制补码形式表示,而实数以IEEE形式表示。

© www.soinside.com 2019 - 2024. All rights reserved.