我正在使用一个fortran程序,它从文件中读取大量数据并以不同的格式将其写回。
我用来读取数据的代码是:
10 read(10,*,err=11,end=20) f,time(i),(a(i,j),j=1,14)
...
goto 10
11 i=i+1
goto 10
它有效,但仅在输入文件正确时才有效。 但有些线条是这样的:
"2014-04-28 07:51:18.9",2705,-8.42144,6.623851,0.4654102,20.99942,"NAN","NAN",0,0,0,0,-9.0605,5.8855,0.4135,21.39728
当发生这种情况时,我会在NAN之后丢失该行中的所有值。有没有办法阅读其他值?
可以将每个值作为字符串读取,然后将它们转换为双精度数? 我对Fortran知之甚少,我需要快速修复它。用C重写所有内容可能需要花费太多时间。
答案 0 :(得分:3)
是的,您可以将整行读入字符串。然后解析字符串并用一些特殊的数值替换“NAN”,例如一个大的负值。内在函数可以帮助,例如index
。然后使用“内部读取”将字符串读入数值变量。
请参阅:Reading comment lines correctly in an input file using Fortran 90,Reading format in Fortran 90和Prevent FORTRAN from closing when a character is inputed instead of a number
答案 1 :(得分:0)
我得到了它的工作。 这是代码:
10 read(10,'(a)',err=16,end=20) linha
linha=trim(adjustl(linha))
pos1=1
n2=0
DO
pos2 = INDEX(linha(pos1:), ",")
IF (pos2 == 0) THEN
n2 = n2 + 1
strings(n2) = linha(pos1:)
EXIT
END IF
n2 = n2 + 1
strings(n2) = linha(pos1:pos1+pos2-2)
pos1 = pos2+pos1
END DO
f=strings(1)
read(strings(2),*) time(i)
j=1
11 read(strings(j+2), *,err=12) a(i,j)
j=j+1
IF (j > 14) THEN
goto 13
END IF
goto 11
12 a(i,j)=9999
j=j+1
goto 11
13 IF (a(i,6)==9999) THEN
goto 14
END IF
pp=1000.
c1=0.622
c2=1.-c1
rv=461.5
e=0.001*a(i,6)*rv*(a(i,4)+273.15)
a(i,6)=1000*e*c1/(100*pp-c2*e)
14 IF (a(i,5)==9999) THEN
goto 15
END IF
mimol=a(i,5)/44
a(i,5)=mimol*83.14*(a(i,4)+273.15)/pp
15 i=i+1
n=i-1
if (i.gt.nmax) goto 20
goto 10
16 i=i+1
goto 10
感谢您的帮助。