[英]Can I read the rest of the line after a positive value of IOSTAT?
我有一个13列41行的文件,其中包括41个不同组的Joback方法的系数。 但是,有些值不存在,并且该表将它们列出为“ X”。 我将表另存为.csv,然后在代码中将文件读取到数组中。 .csv的两行摘录(第二行包含不存在的系数)如下所示:
48.84,11.74,0.0169,0.0074,9.0,123.34,163.16,453.0,1124.0,-31.1,0.227,-0.00032,0.000000146
X,74.6,0.0255,-0.0099,X,23.61,X,797.0,X,X,X,X,X
我尝试做的是读取并定义一个数组来保存每个IOSTAT值,这样我就可以知道是否读取了“ X”(即IOSTAT为正数):
DO I = 1, 41
(READ(25,*,IOSTAT=ReadStatus(I,J)) JobackCoeff, J = 1, 13)
END DO
我发现问题是,如果要读取的行的第一个值为“ X”,产生一个正数的ReadStatus值,那么这些行的其余值将无法正确读取。
我的意图是,如果JobackCoeff(I,J)导致读取错误,则使用ReadStatus数组生成一条错误消息,从而查明“ X”。
出现读取错误后,我可以强制程序继续读取一行吗? 还是有更好的方法呢?
一旦在输入执行过程中发生错误,则输入列表的处理将终止。 此外,输入列表中指定的所有变量都将变为未定义。 对第一个问题的简短回答是:不,在读取错误后无法继续读取一行。
然后,当需要更复杂的输入处理时,我们得到通常的答案:将行读入字符变量并进行处理。 我不会为您编写完整的代码(主要是因为尚不清楚确切需要什么),但是当您拥有字符变量时,您可能会发现index
内在函数很有用。 有了它,您可以找到X
s(通过重复调用子字符串以在一行中找到所有它们)。
或者,如果您提供显式格式(而不是依赖于列表定向( fmt=*
)输入),则可以使用非高级输入(在read
语句中为advance='no'
)执行某些操作。 但是,一旦出现错误情况,文件的位置就会变得不确定:您还必须处理这个问题。 将行作为一个字符变量进行处理可能要简单得多。
下面给出了该概念的概述(没有声明,鲁棒性)。
read(iunit, '(A)') line
idx = 1
do i=1, 13
read(line(idx:), *, iostat=iostat) x(i)
if (iostat.gt.0) then
print '("Column ",I0," has an X")', i
x(i) = -HUGE(0.) ! Recall x(i) was left undefined
end if
idx = idx + INDEX(line(idx:), ',')
end do
许多Fortran程序员和其他语言的程序员长期以来一直使用的替代方法是使用某种编辑器(我喜欢sed
)并通过将所有X
更改为NAN
来修改文件。 您的编译器必须为此提供支持IEEE NaN
(当前广泛使用的大多数作物都支持),它们将正确地将输入文件中的NAN
解释为值为NaN
的实数。
与已经接受(且非常好)的答案相比,此方法的好处是不需要Fortran中的巧妙编程即可解析包含混合条目的输入行。 使用编辑器进行字符串处理,使用Fortran读取数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.