Fortran files in Microsoft Visual Studio

  1. I'm new to Microsoft Visual Studio (2010) & I'm a bit confused by the way Visual Studio handles fortran files. I saved a set of data in one console and tried to read the data from the created file in another console. I receive the next message:

    file opened correctly!
    forrt1: severe<24>: end-of-file during read, unit 1, file C:\Doculents and settings\.......

    I've tried to save the data as .dat and .txt and the message remained the same. The funny thing is that I can read the saved .txt and .dat files in Matlab!

    Does anyone know why I receive this message?
     
  2. jcsd
  3. Sounds like your trying to read past the end-of-file during your input. Try using the END option within your READ statement.
     
  4. Thanks a lot TheoMcCloskey. I have done some searching to fully understand the function of the END specifier with little success. Could you please expand a bit on the use of END?????
     
  5. jtbell

    Staff: Mentor

    The statement

    READ (10, 50, END=200) X

    says: "Try to read the variable X from unit 10 using format statement 50. If you hit the end of the file while trying to read X, jump to statement 200."

    In order for this to work, of course, you have to put statement number 200 on the statement that you want to pick up execution from when you reach the end of the file.
     
  6. Thanks a lot for the quick answer.. I'll see if that will solve the problem..
     
  7. Well.. the file is still unread.. I think I should post the codes=>

    =>The program I used to create the data is

    program xytable
    ! this code is to create data for the interpolation code written in console12
    implicit none
    integer::i,j
    integer,parameter::m=50
    real,dimension(1:m)::t,h
    real,dimension(m,2)::A ! a 2D matrix to store x & y


    !create data
    do i=1,m
    t(i)=(i*1.-1.)/2.
    h(i)=f(t(i))
    A(i,1)=t(i)
    A(i,2)=h(i)
    end do

    !save data
    open(1,file='xytable.txt')
    do i=1,m
    print*,(A(i,j),j=1,2)
    write(1,*)(A(i,j),j=1,2)
    end do
    close(1)



    !define function f(x)
    contains
    function f(t)
    real::f,t
    f=2*t**2-t
    end function f

    end program xytable


    The data as appear in the text file are:

    0.0000000E+00 0.0000000E+00
    0.5000000 0.0000000E+00
    1.000000 1.000000
    1.500000 3.000000
    2.000000 6.000000
    2.500000 10.00000
    3.000000 15.00000
    3.500000 21.00000
    4.000000 28.00000
    4.500000 36.00000
    5.000000 45.00000
    5.500000 55.00000
    6.000000 66.00000
    6.500000 78.00000
    7.000000 91.00000
    7.500000 105.0000
    8.000000 120.0000
    8.500000 136.0000
    9.000000 153.0000
    9.500000 171.0000
    10.00000 190.0000
    10.50000 210.0000
    11.00000 231.0000
    11.50000 253.0000
    12.00000 276.0000
    12.50000 300.0000
    13.00000 325.0000
    13.50000 351.0000
    14.00000 378.0000
    14.50000 406.0000
    15.00000 435.0000
    15.50000 465.0000
    16.00000 496.0000
    16.50000 528.0000
    17.00000 561.0000
    17.50000 595.0000
    18.00000 630.0000
    18.50000 666.0000
    19.00000 703.0000
    19.50000 741.0000
    20.00000 780.0000
    20.50000 820.0000
    21.00000 861.0000
    21.50000 903.0000
    22.00000 946.0000
    22.50000 990.0000
    23.00000 1035.000
    23.50000 1081.000
    24.00000 1128.000
    24.50000 1176.000




    =>The program I am reading the data in is:

    program readtext
    implicit none

    !interface between main program and subroutine
    interface
    subroutine polint(x,y,xin,yout,dyout)
    use nrtype
    real(sp),dimension(:),intent(in)::x,y
    real(sp),intent(in)::xin
    real(sp),intent(out)::yout,dyout
    end subroutine polint
    end interface

    !declare variables
    real,allocatable,dimension(:)::x,y
    real::xin,yout,dyout,t,h
    integer::p,st,row,col
    integer,parameter::n=50
    real,dimension(n,2)::A


    !make memory for the input x and y arrays
    if(allocated(x)) then
    deallocate(x)
    end if
    if(allocated(y))then
    deallocate(y)
    end if
    allocate(x(1:n),y(1:n),stat=p)
    if(p /= 0) then
    print*,"allocation error"
    stop
    end if


    !load data into the code
    open(unit=1,file='xytable.txt',form='formatted',iostat=st)
    if(st/=0)then
    print*,'Error opening file. File load status=',st
    stop
    else
    print*,'file opened correctly!.ios=',st
    end if

    do row = 1,n
    read(1,*,end=50)(A(row,col),col=1,2)
    end do

    50 do row = 1,n
    print*,(A(row,col),col=1,2)
    end do

    print*, "dimension of x and y arrays="
    print*,n

    end program readtext

    I reach the statement '50' but all the numbers in both columns are zeros. I've been advised to change the read loop to:

    read(1,*,end=50) A(row,:)
    read(1,*,end=50) A(row,1),A(row,2)

    but the result is unchanged.. I really can't see where the problem lies.
     
  8. Rositta,

    I was able to sucessfully run this (without interface to polint) but I had to make one change in your open statement within READTEXT program; change "io stat" to "iostat".

    I used gfortran (gcc ver 4.3 20070522) on Windows XP.
     
  9. Thanks TheoMcCloskey. It is "iostat" in my original code. Apparently I made a mistake during pasting the code. I still have the problem of getting zero valued entities instead of the saved numbers.
     
  10. I'm not sure what else to say. Your program "XYTABLE" does produce the required 50 lines of data, 2 per line, no delimiter, spaced separated.

    The very fact that your original problem suggested reading past the end-of-file (EOF) has me suspicious. I did not have that problem. The program should not require the read statement “END” option in this particular case. I’ve modified the program “READTEXT” as shown below to print a message if, in fact, it does try to read past EOF (see listing below). Try it and let me know.

    Are you sure you are connected to data file? What does your print message flag report (variable “st”).

    Code (Text):

     [FONT="Courier New"]
          program readtext
          implicit none
         
          !interface between main program and subroutine
    !     interface
    !     subroutine polint(x,y,xin,yout,dyout)
    !     use nrtype
    !     real(sp),dimension(:),intent(in)::x,y
    !     real(sp),intent(in)::xin
    !     real(sp),intent(out)::yout,dyout
    !     end subroutine polint
    !     end interface
         
          !declare variables
          real,allocatable,dimension(:)::x,y
          real::xin,yout,dyout,t,h
          integer::p,st,row,col
          integer,parameter::n=50
          real,dimension(n,2)::A

         
          !make memory for the input x and y arrays
          if(allocated(x)) then
          deallocate(x)
          end if
          if(allocated(y))then
          deallocate(y)
          end if
          allocate(x(1:n),y(1:n),stat=p)
          if(p /= 0) then
          print*,"allocation error"
          stop
          end if
         

          !load data into the code
          open(unit=1,file='xytable.txt',form='formatted',iostat=st)
          if(st/=0)then
              print*,'Error opening file. File load status=',st
              stop
          else
              print*,'file opened correctly!.ios=',st
          end if

          do row = 1,n
              read(1,*,end=50)(A(row,col),col=1,2)
          end do
          go to 60

       50 continue
          print *, "WARNING: read past EOF"

       60 continue
          do row = 1,n
              print *,(A(row,col),col=1,2)
          end do

          print *, "dimension of x and y arrays="
          print *,n
         
         
    !     pause
          end program readtext[/FONT]
     
  11. Hi TheoMcCloskey.. I've tried the modification with no change in the output. I do have a data file which I can read in Matlab as I mentioned in my first post. The flag report gives st=0. I found another Physics Forum thread talking about the same problem:
    https://www.physicsforums.com/showthread.php?t=307269
    Could it be a compiler problem???
     
  12. well.. the code worked with no problems at all in gfortran..
     
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook