我有一个小的Fortran程序,它接受一个输入数据文件。此数据文件有两种可能的格式:
1.1.2
和
a 0 0
b 0 0
c a b
d a c
即。基本格式是三列字符,空格分隔。我们不期望除了连字符和下划线之外的特殊字符。 扩展格式有第四列,整数为0或1。
我不确定这样做的最好(也是最简单)方法。我试图通过以下方式测试第四列:
a 0 0 1
b 0 0 1
c a b 0
d a c 0
但是,只有给出三列时,这并没有引起任何错误。
答案 0 :(得分:1)
你的行
read(1001, '(a,a,a,i1)', iostat=stat) a1, a2, a3, a4
是正确的(我只是不知道格式中'/'的原因。)
但是你必须测试stat
变量。如果为零,则读取成功,并且您有四列。如果出现错误情况,stat
将为正数。然后,您可以尝试只读取三列,如果成功使用stat==0
,则您有三列。
我实际上会将该行读入字符串并从那里读取:
read(1001, '(a)', iostat=stat) line
if (stat/=0) treat_error_cannot_read_from_file
read(line, '(a,a,a,i1)', iostat=stat)) a1, a2, a3, a4
if (stat/=0) then
read(line, '(a,a,a)', iostat=stat)) a1, a2, a3
if (stat/=0) then
error...
else
n_columns = 3
end if
else
n_columns = 4
end if
答案 1 :(得分:0)
感谢@ vladimir-f建议从一条线上阅读。
问题是如果缺少第四列(数据字段),Fortran将无法继续从下一行读取数据。
在这个解决方案中,我们读取(仅!)中的第一行,并将其用作格式化读取的输入,如果缺少最后一个字段,则会失败。
integer :: stat,fourthColumn
character(len=1000) :: dumC
character, dimension(1:3) :: pedline
read(102, '(a)', advance='NO', iostat=stat) dumC
if (stat > 0) then
print *, 'Problems reading input file.'
print *, stat, dumC
stop 1
endif
! Test if the line contains three or four columns
fourthColumn = -99
read(dumC, *, iostat=stat) pedline, fourthColumn
if (stat .eq. -1 .and. fourthColumn .eq. -99) then
n_columns = 3
else
n_columns = 4
endif