Runtime error while reading file in fortran90

Click For Summary

Discussion Overview

The discussion revolves around a runtime error encountered while trying to read a triangular matrix from a file in Fortran 90. Participants explore potential issues with the code and suggest modifications to rectify the error.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes the error encountered when executing the Fortran code, specifically an "End of file" runtime error.
  • Another participant suggests using an IOSTAT specifier in the READ statement to handle end-of-file conditions.
  • A different participant points out that the current READ statement reads only one item at a time, which may not align with the file's structure, indicating that each line should be read as a whole.
  • Another suggestion is made to eliminate the inner loop for columns and instead read all values in a single call using an implied DO loop.
  • One participant notes a syntax error in the suggested READ statement, indicating a missing left parenthesis.
  • A participant emphasizes the importance of including WRITE statements for debugging purposes after each READ statement to verify the data being read.
  • One participant confirms that the suggested changes resolved the issue.

Areas of Agreement / Disagreement

Participants generally agree on the need to modify the READ statement to correctly handle the file's structure, but there are multiple suggestions on how to implement these changes. The discussion remains somewhat unresolved as different approaches are proposed.

Contextual Notes

Participants express uncertainty regarding the exact structure of the input file and how it should be read into the program, which affects the proposed solutions.

kranthi4689
Messages
16
Reaction score
0
I'm new to fortran coding and trying to read a file called "data.dat" with data like a triangular matrix
0.1 0.1 0.2 0.1 0.2 0.3 0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.4 0.5

using the code
PROGRAM matrix IMPLICIT NONE REAL, DIMENSION(5,5) :: a INTEGER :: row,col,max_rows,max_cols max_rows=5 max_cols=5 OPEN(UNIT=10, FILE="dat.dat",status='old') DO row = 1,max_rows DO col = 1,max_cols if (col .le. row) then read(10,*) a(row,col) else a(row,col) = 0.0 endif END DO END DO DO row = 1,max_rows WRITE(*,*) (a(row,col),col = 1,max_cols) END DO END PROGRAM matrix

While executing the code I get the following error
At line 11 of file matrix.f90 (unit = 10, file = 'dat.dat')
Fortran runtime error: End of file
Error termination. Backtrace:


How do I rectify this error. kinldy help me.
 
Technology news on Phys.org
Use an IOSTAT specifier in your READ statement to tell the program what to do when it reaches the end of file.

https://pages.mtu.edu/~shene/COURSES/cs201/NOTES/chap04/iostatus.html
Aha, now I see something else which is likely your real problem. You're reading only one item at a time. Each READ statement reads a whole line at once, so this requires that each item be on a separate line.

If each line of the file contains a whole row of the matrix, the READ statement should read all of those items at once.

(it looks like BvU wrote his post while I was adding the "Aha...".)
 
Hi,

Your read statement starts on a new record (line) for every call, so after five calls it hits end-of file.

You need to read all values on a line in a single call to read, e.g. with an implied DO loop .
So get rid of the DO col = 1,max_cols and use something like (I didn't try it out)

Fortran:
read (10,*) (a(row,col), col = 1, row)
 
There should be one more left-parenthesis:

Code:
read (10,*) (a(row,col), col = 1, row))

Tip: for testing and debugging, always put a WRITE statement immediately after every new READ statement, so you can check that you're actually reading what you intended to read. After you're sure your READ is working properly, you can remove the WRITE.
 
jtbell said:
There should be one more left-parenthesis:

Code:
read (10,*) (a(row,col), col = 1, row))

Tip: for testing and debugging, always put a WRITE statement immediately after every new READ statement, so you can check that you're actually reading what you intended to read. After you're sure your READ is working properly, you can remove the WRITE.
thank you @jtbell.. it worked.
 
You're welcome :wink:
 

Similar threads

  • · Replies 17 ·
Replies
17
Views
7K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 22 ·
Replies
22
Views
5K
  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 16 ·
Replies
16
Views
3K
  • · Replies 2 ·
Replies
2
Views
8K
  • · Replies 5 ·
Replies
5
Views
2K
  • · Replies 1 ·
Replies
1
Views
3K