user7364917
user7364917

Reputation: 11

`Error: Syntax error in OPEN statement` when opening a file for reading

rogram readfromfile
  implicit none
    integer :: N, i
    integer, dimension(130,2) :: cs

  OPEN (UNIT=20,FILE='readtry.txt',STATUS='OLD',FORM='UNFORMATTED',)
    do i=1,130
    read (*,*) cs(i,1), cs(i,2)
    enddo


    do i=1,130
        print *, cs(i,1), cs(i,2)
    enddo

I am a beginner in programming, I just want read data from a file which has two columns and approximately 130 lines. I have tried to write down this code but its not working can someone please help?

The following error appears

gfortran -Wall -c "Rwarray.f95" (in directory: D:\Fortrandir\2Darrays)
Rwarray.f95:7:67:
   OPEN (UNIT=20,FILE='readtry.txt',STATUS='OLD',FORM='UNFORMATTED',)
                                                                   1
Error: Syntax error in OPEN statement at (1)
Compilation failed.

Upvotes: 1

Views: 1097

Answers (1)

chw21
chw21

Reputation: 8140

you have a compile time error, not a problem reading. But here's the gist of it:

It complains about a syntax error. Your statement is like this:

open(xxx, xxx, xxx, xxx,)

In order for it to compile, you need to remove the last comma. But I don't think that will give you what you want.

When you open the file, you declare it to be unformatted. Unformatted basically means that it contains the values in some form of binary. What's more, unformatted is not guaranteed to work between computers. So unless this file was written on your system, by a Fortran Program, with the FORM="UNFORMATTED" parameter, I don't think you'll get what you want.

I suspect that your input file looks something like this:

1   3
2   10
31  4711

That would be FORMATTED, not UNFORMATTED.

Then you use read(*, *). But the first * in there refers to "standard input", if you want to read from the file, you want to use the read(20, *), as 20 is the unit on which you opened the input file.

For the write statement, the * is correct, assuming that you want to write to "standard output" -- i.e. the screen.

What I'd further recommend is to use the error handling routines. Add these two variables to your declaration block:

integer :: ios
character(len=100) :: iomsg

And then use them whenever you open, read, or write:

open(unit=xx, file=xxx, status=xxx, action=xxx, form=xxx, io_stat=ios, iomsg=iomsg)
call check(ios, iomsg, "OPEN")

read(20, *, io_stat=ios, iomsg=iomsg) cs(1, i), cs(2, i)
call check(ios, iomsg, "READ")

You'd have to include the check subroutine, of course:

program readfromfile
    implicit none
    <declaraction block>
    <execution block>
contains
    subroutine check(ios, iomsg, action)
        integer, intent(in) :: ios
        character(len=*), intent(in) :: iomsg
        character(len=*), intent(in), optional :: action
        if (ios == 0) return  ! No error occured, return
        print*, "Error found. Error code:", ios
        print*, "Message: ", trim(iomsg)
        if (present(action)) print*, "Action was: ", trim(action)
        stop 1
    end subroutine check
end program readfromfile

Upvotes: 1

Related Questions