使用Fortran 90在输入文件中正确读取注释行

rks*_*171 5 file-io fortran comments gfortran

据我所知,当从文件中读取数据时,Fortran将跳过以和星号(*)开头的行,假设它们是注释.好吧,我似乎在使用我创建的一个非常简单的程序实现此行为时遇到了问题.这是我简单的Fortran程序:

  1       program test
  2 
  3       integer dat1
  4 
  5       open(unit=1,file="file.inp")
  6 
  7       read(1,*) dat1
  8 
  9 
 10       end program test
Run Code Online (Sandbox Code Playgroud)

这是"file.inp":

  1 *Hello
  2 1
Run Code Online (Sandbox Code Playgroud)

我建立了我的简单程序

gfortran -g -o test test.f90
Run Code Online (Sandbox Code Playgroud)

当我跑,我得到错误:

At line 7 of file test.f90 (unit = 1, file = 'file.inp')
Fortran runtime error: Bad integer for item 1 in list input
Run Code Online (Sandbox Code Playgroud)

当我删除注释行运行输入文件时,即:

1 1
Run Code Online (Sandbox Code Playgroud)

代码运行正常.因此Fortran正确解释该注释行似乎是一个问题.它必须是非常简单的东西,我在这里失踪,但我不能在谷歌上发现任何东西.

M. *_* B. 7

Fortran不会自动跳过输入文件中的注释行.您可以通过首先将行读入字符串,检查注释符号的第一个字符或搜索该符号的字符串,然后如果该行不是注释,对字符串执行"内部读取"操作,就可以轻松地完成此操作获取数值.

就像是:

use, intrinsic :: iso_fortran_env

character (len=200) :: line
integer :: dat1, RetCode

read_loop: do
   read (1, '(A)', isostat=RetCode)  line
    if ( RetCode == iostat_end)  exit ReadLoop
    if ( RetCode /= 0 ) then
      ... read error
      exit read_loop
    end if
    if ( index (line, "*") /= 0 )  cycle read_loop
    read (line, *) dat1
end do read_loop
Run Code Online (Sandbox Code Playgroud)

  • 除其他外,iso_fortran_env提供值"isostat_end"来测试非零返回码是否为文件结尾.这允许使用"exit"构造而不是语句标签,如"end = LineNumber". (2认同)