测试数据文件中是否有3列或4列

时间:2016-02-02 17:03:34

标签: fortran

我有一个小的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

但是,只有给出三列时,这并没有引起任何错误。

2 个答案:

答案 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