Search code examples
file-iocommentsfortrangfortran

Reading comment lines correctly in an input file using Fortran 90


It is my understanding that Fortran, when reading data from file, will skip lines starting with and asterisk (*) assuming that they are a comment. Well, I seem to be having a problem with achieving this behavior with a very simple program I created. This is my simple Fortran program:

  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

This is "file.inp":

  1 *Hello
  2 1

I built my simple program with

gfortran -g -o test test.f90

When I run, I get the error:

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

When I run the input file with the comment line deleted, i.e.:

1 1

The code runs fine. So it seems to be a problem with Fortran correctly interpreting that comment line. It must be something exceedingly simple I'm missing here, but I can't turn up anything on google.


Solution

  • Fortran doesn't automatically skip comments lines in input files. You can do this easily enough by first reading the line into a string, checking the first character for your comment symbol or search the string for that symbol, then if the line is not a comment, doing an "internal read" of the string to obtain the numeric value.

    Something like:

    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