Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Reading and Displaying text file in Fortran

  1. Jan 7, 2012 #1
    I am trying to read and display the content of a text file in Fotran 90 to make sure that fortran is interpreting the data correctly. Eventually I want to store the data in an array so I can calculate averages, but at the moment I am still working on getting the data displayed in Fortran. I've been at it for a couple hours and cannot figure out the problem. I am getting an end of the file runtime error. Here is the code:

    PROGRAM testx
    IMPLICIT NONE
    CHARACTER(20) :: File Name
    INTEGER :: Count = 0, OpenStatus, InputStatus
    REAL :: Y, M, D, Rain, Tmax, Tmin, srain, stmax, stmin
    WRITE (*, '(1X, A)', ADVANCE = "NO") "Enter name of data file:"
    READ *, FileName
    OPEN (UNIT = 15, FILE = FileName, STATUS = "OLD")
    READ(15,*) Y, M, D, Rain, Tmax, Tmin
    100 FORMAT (6x)
    PRINT 100, "Year", "Month", "Day", "Rainfall", "MxTemp", "MiTemp"
    END PROGRAM testx

    Here is the text file containing the data I am working with:
    View attachment testx.txt
     
    Last edited: Jan 7, 2012
  2. jcsd
  3. Jan 7, 2012 #2

    Mark44

    Staff: Mentor

    When you enter code in your post, please surround it with [noparse]
    Code (Text):
     and
    [/noparse] tags. I have done this below.
    I suspect that your code is reading the data correctly, but your PRINT statement is just printing the strings, not the values of the variables. Also, your format statement is not what you want.

    You are going to need a DO loop of some kind to iterate through the data in your input file. Your code above reads one set of six items and no more.

    I did a search for "fortran format statement". This is the first of many links I got: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html.
     
  4. Jan 7, 2012 #3
    Okay I changed the code around a bit. It compiles but the program itself is giving me an error: "STOP ***Input error***" I'm not sure how to fix this.

    Code (Text):
          PROGRAM testx
          IMPLICIT NONE
          CHARACTER(20) :: FileName
          INTEGER :: Count = 0, OpenStatus, InputStatus
          REAL :: Y, M, D, Rain, Tmax, Tmin, srain, stmax, stmin
          ! Open the file as unit 15.
          ! Input and output formats and proper display
          WRITE (*, '(1X, A)', ADVANCE = "NO") "Enter name of data file:"
          READ *, FileName
          OPEN (15, FILE = FileName, STATUS = "OLD", IOSTAT=OpenStatus)
          IF (OpenStatus > 0) STOP "***Cannot open the file ***"
     99   FORMAT (1X, A5, 1X, A5, 1X, A4, 1X, A8, A8, A8)
     100  FORMAT (1X, I4, 1X, I2, 1X, I2, 1X, F4.2, 1X, F4.2, F4.2)
          PRINT 99, "Year", "Month", "Day", "Rainfall", "MaxTemp", "MinTemp"
          PRINT 99, "====", "=====", "===", "========", "=======", "======="
          ! Read the data line by line
          ! Display the data in a table
          DO
           READ (15, FMT=100, IOSTAT=InputStatus) Y, M, D, Rain, Tmax, Tmin
           IF (InputStatus > 0) STOP "***Input error ***"
           IF (InputStatus < 0) EXIT ! end of file
           PRINT 100, Y, M, D, Rain, Tmax, Tmin
          END DO  
         
          END PROGRAM testx
    To try and identify the error I took out the
    Code (Text):
    IF (InputStatus > 0) STOP "***Input error ***"
    and got a error from Fortran saying that it expected an Integer but got a real, yet the first number in the text file is an integer.
     
    Last edited: Jan 7, 2012
  5. Jan 8, 2012 #4

    jtbell

    User Avatar

    Staff: Mentor

    Are you still using the same test file as attached in your first post? That file doesn't match the FORMAT statement for your READ statement.
     
  6. Jan 8, 2012 #5
    Yes, where there were commas there are now spaces. So the file at the beginning looks like:

    1948 8 1 0.02 89.0 71.0
    1948 8 2 0.00 90.0 72.0
    And so on....

    The 100 FORMAT statement reads space first so I took the "1X" out of the code in my last post. Then the next is "I4" since the year is a 4 digit integer, then 1X for a space, and so for the next integer for day and month, then rational numbers for the rain, tmax, amd tmin. But I still get an error...

    To further test this I removed the specified format and changed the read statement to
    Code (Text):
    READ (15, FMT=*, IOSTAT=InputStatus) Y, M, D, Rain, Tmax, Tmin
    .
    I don't get an error but the data is not displaying on the screen. The only thing being printed is the table format, but not the actual values from the text file.
     
    Last edited: Jan 8, 2012
  7. Jan 8, 2012 #6

    jtbell

    User Avatar

    Staff: Mentor

    As I recall, if the data is separated by spaces, you don't need to specify a format, but can use the default format instead, so try that:

    READ (15, FMT=*, IOSTAT=InputStatus) Y, M, D, Rain, Tmax, Tmin

    or simply

    READ (15, *, IOSTAT=InputStatus) Y, M, D, Rain, Tmax, Tmin

    Just make sure the input file doesn't have a REAL value where the program expects to read an INTEGER.

    You need to specify an input format mainly when the data is not separated by spaces. For example, if you have a date in the format 20120108 and want to read the year, month and day separately, you need to use the format I4, 2I2. This sort of thing was common in the dark ages of programming, when punched cards were the most common input medium and people didn't want to waste any of the 80 columns by putting unnecessary blank spaces in them.
     
  8. Jan 8, 2012 #7

    Yes, I tried that see the post above you. No error in the program but the numerical data from the text file is not displaying for some reason.

    Here's what my code looks like now:

    Code (Text):
          PROGRAM testx
          IMPLICIT NONE
          CHARACTER(20) :: FileName
          INTEGER :: Count = 0, OpenStatus, InputStatus, Y, M, D
          REAL ::  Rain, Tmax, Tmin, srain, stmax, stmin
          ! Open the file as unit 15.
          ! Input and output formats and proper display
          WRITE (*, '(1X, A)', ADVANCE = "NO") "Enter name of data file:"
          READ *, FileName
          OPEN (15, FILE = FileName, STATUS = "OLD", IOSTAT=OpenStatus)
          IF (OpenStatus > 0) STOP "***Cannot open the file ***"
     99   FORMAT (1X, A5, 1X, A5, 1X, A4, 1X, A8, A8, A8)
     100  FORMAT (I4, 1X, I2, 1X, I2, 1X, F4.2, 1X, F4.2, F4.2)
          PRINT 99, "Year", "Month", "Day", "Rainfall", "MaxTemp", "MinTemp"
          PRINT 99, "====", "=====", "===", "========", "=======", "======="
          ! Read the data line by line
          ! Display the data in a table
          DO
           READ (15, FMT=*, IOSTAT=InputStatus) Y, M, D, Rain, Tmax, Tmin
           IF (InputStatus > 0) STOP "*** Input error ***"
           IF (InputStatus < 0) EXIT ! end of file
           PRINT *, Y, M, D, Rain, Tmax, Tmin      
          END DO  
         
          END PROGRAM testx
     
     
    Last edited: Jan 8, 2012
  9. Jan 8, 2012 #8

    Mark44

    Staff: Mentor

    I don't see anything obvious. After you open the file, you stop if OpenStatus > 0. You aren't checking for negative values, so if one occurs, that will affect reading data from the file.
     
  10. Jan 8, 2012 #9
    I fixed the FORMAT statement in my code and got the data read and displayed correctly.
     
  11. Mar 15, 2012 #10
    There are two errors in this code:
    1. There's a space in the variable "File Name" in line 3.
    2. There is no data format item in the FORMAT statement.
    It needs to be something like
    100 FORMAT (6X, 6A)
    which provides the means for the six strings (the headings) to be
    printed out.
     
  12. Jul 16, 2013 #11
    Can you explain the correction that you have done in your format statement.
    what was the correction?
     
  13. Jul 16, 2013 #12
    What was the correction that you have done in the format statement?
     
  14. Jul 16, 2013 #13

    SteamKing

    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    Rems, the OP is a year and a half old. I wouldn't wait too eagerly for a response.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook