• Fortran

## Main Question or Discussion Point

Fortran, File Read Error[Resolved itself, fixed]

Basically I'm writing a simple fortran program to read in a data file formatted as shown below and then calculate the line of best fit for the given data points.

N
x1 y2
x2 y2
. .
. .
. .
xn yn

Where N is the number of rows in the data file. The code is shown below, compiles fine but when I run the program and input the data file name say, "info.dat" I get a "attempted to read past end of file" error at line 21, which is where my DO loop is, but the do loop is only from 1 to N, so what could be the issue?

Code:
PROGRAM LineOfBestFit
IMPLICIT NONE
REAL:: xavg,yavg, sumx, sumxy,sumxx,sumy,slope,intercept
REAL,DIMENSION(40)::x, y
INTEGER::N,i, iostat,openstatus !N is the number of points which will be first line of data file
CHARACTER::filename*20
sumx=0
sumxy=0
sumxx=0
sumy=0
[B]PRINT*,[/B] "Enter the name of the data file which contains the data to be evaluated."
[B]OPEN[/B](UNIT=1,FILE=filename,STATUS='OLD',IOSTAT=OpenStatus)
!Check for succesful open.
[B]IF[/B](OpenStatus>0)[B]THEN[/B]
PRINT*, "Unable to open file!"
[B]STOP[/B]
[B]ENDIF[/B]
[B]DO[/B] i=1,N
sumx=sumx+x(i)
sumy=sumy+y(i)
sumxy=sumxy+x(i)*y(i)
sumxx=sumxx+x(i)**2
[B]ENDDO[/B]
CLOSE(1)!Done with file, so close it.
xavg=sumx/N
yavg=sumy/N
slope=(sumxy-sumx*yavg)/(sumxx-sumx*xavg)
intercept=yavg-slope*xavg
WRITE(*,10) "The line of best fit is: y=",slope,"x+",intercept
10 FORMAT(A,F4.2,A,F4.2)
[B]ENDPROGRAM[/B] LineOfBestFit
Thanks Fellas.

Last edited:

Related Programming and Computer Science News on Phys.org
SteamKing
Staff Emeritus
Homework Helper

Also make sure N <= 40 in the data file.

Also make sure N <= 40 in the data file.
N was definitely less than forty in the data file, I tinkered around with the code a bit and replaced the f8.1 with the standard *. Seemed to resolve the problem, I imagine the issue was that I only read the leftmost column and skipped the right column.

SteamKing
Staff Emeritus
Homework Helper

I'm going on memory, but when you use a single format enclosed in parenthesis, like '(F8.1)', FORTRAN will keep using this format, but after reading one value, the format is repeated only after a new record (or new line) is issued. So, in your program, you would have read a sequence of x values, but the y values would be ignored.

The best thing to do, here, is to NOT use a format string in your READ statement and just let it be (1,*) ...this is what you did when reading the integer number...

If you specify a format, then, if the numbers are not exactly like that, you may have difficulties...just leave it (n,*)...this is called "list oriented" and it is the only thing I ever use...for reading, that is.