Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 格式化读取时的Fortran错误检查_Io_Fortran_Fortran90 - Fatal编程技术网

Io 格式化读取时的Fortran错误检查

Io 格式化读取时的Fortran错误检查,io,fortran,fortran90,Io,Fortran,Fortran90,在我的代码中,我试图读入输出文件,这些文件的第一行可能有格式化的整数,也可能没有格式化的整数。为了帮助向后兼容,我正在尝试阅读两个示例,如下所示 head -n 3 infile_new 22 8 98677.966601475651 -35846.869655806520 3523978.2959464169 或 infle_new顶行的格式是'(i5),因此我可以在代码中使用 read(iunit, '(I5)' )

在我的代码中,我试图读入输出文件,这些文件的第一行可能有格式化的整数,也可能没有格式化的整数。为了帮助向后兼容,我正在尝试阅读两个示例,如下所示

head -n 3 infile_new
   22
           8
   98677.966601475651       -35846.869655806520        3523978.2959464169       

infle_new
顶行的格式是
'(i5)
,因此我可以在代码中使用

read(iunit, '(I5)' ) n
这很好,但是如果我尝试使用它读入
infle_old
,我会得到一个错误。我试图通过以下方法来解决这个问题

    read(iunit, '(I5)' , iostat=ios, err=110) n

110 if(ios == 0) then
      print*, 'error in file, setting n'
      naBuffer = na
      !rewind(iunit) #not sure whether to rewind or close/open to reset file position
      close(iunit)
      open (iunit, file=fname, status='unknown')
    else
      print*, "Something very wrong in particle_inout"
    end if
这里的问题是,在读取旧文件或新文件时,代码最终进入错误循环。我找不到太多关于以这种方式使用read语句的文档,但无法确定哪里出了问题


我的一个理论是我在if语句中使用了
ios==0
,但我认为,既然我在读取新文件时不应该出错,那就没关系了。如果有人知道捕捉此类错误的方法,那就太好了。

根据您向我们展示的内容,在代码执行read语句后,它会执行标记为
110
的语句。然后,如果没有错误并且
iostat==0
则执行
if
构造的真正分支

因此,如果读取过程中出现错误,代码将跳转到该语句,如果没有错误,代码将转到同一语句。如果read语句中没有错误,代码就不会神奇地知道不执行从标签110开始的代码。就我个人而言,我从未在同一个read语句中同时使用过
iostat
err
,我想这会让你大吃一惊

尝试将read语句更改为

read(iunit, '(I5)' , iostat=ios) n
如果构造一个位,那么您需要重新处理
,因为
iostat==0
不是一个错误条件

顺便说一下,要读取已知只包含一个整数的行,我不会使用显式格式,我只会使用

read(iunit, * , iostat=ios) n

让运行时担心整数有多大以及在哪里可以找到它。

可能重复@francescalus:是的,重复。但是OP没有找到它是可以原谅的。大家好,是的,谢谢你们指出了在链接问题中使用
err
条件的相似性,以及为什么这会导致这里出现问题。大家好,马克,谢谢你们澄清标签代码是如何执行的。我从梅特卡夫、里德和科恩解释的现代Fortran中得到了一个关于如何使用
err
条件的例子,他们过去从未把我引入歧途。仅使用非显式读取的问题在于,新文件除了具有额外(类似)的第1行之外是相同的,并且仅在读取其下的数据时会导致问题。
read(iunit, * , iostat=ios) n