Ramirez
Ramirez

Reputation: 47

GFortran I/O error 5002 while reading a direct access file

I have a little Problem reading a file in Fortran. As you can see I am lopping over a file reading certain records with a specific length.

What happens is, when it comes to a certain record I'm getting an IOSTAT Error 5002. Now my question is what does this error mean: is it end of file or there is no record left or something else? Can I ignore it?

I am using MinGW GFortran 4.8.0.

Here's the code:

PROGRAM test_read

INTEGER*4           HCM_error
DOUBLE PRECISION    N_Record(22)
CHARACTER*8         C_Record(22)

EQUIVALENCE         (N_Record,C_Record)

OPEN (UNIT=11, FILE='C:/BORDER/D__HOL.000',STATUS='OLD', ACCESS='DIRECT',RECL=176, ACTION='READ', IOSTAT=IOS)

HCM_error=0

DO N_rec = 1, 2000
    READ (11, REC=N_rec, IOSTAT=IOS) C_Record

    WRITE(*,*) "|",IOS,' ',N_rec,' ',N_record(21),' ',N_record(22),"|"

    !End of file reached (or non existing record) ?
    IF ((IOS .LT. 0) .OR. (IOS .EQ. 36)) EXIT

    IF (IOS .NE. 0) THEN
        !Error in (border-) line data
        HCM_Error = 1049
        EXIT
    END IF
END DO

CLOSE(UNIT=11)

WRITE (*,*) HCM_error 
END PROGRAM

Upvotes: 1

Views: 2299

Answers (1)

francescalus
francescalus

Reputation: 32366

The non-zero values returned by an iostat= specifier are not portable across compilers. If you wish to determine what a particular code means then you have two options:

  • read the compiler's documentation (if it exists)
  • use the iomsg= specifier with a character variable

In this case, when you tried iomsg= you got the message "Non-existing record number". So, problem solved.

Well, almost. There's more to say.

You may be surprised that you are going through records in turn in direct access, but are reaching a "no record" state without first reaching an "end of file" state. You are testing (IOS .LT. 0) with a comment "!End of file reached".

When reading a file connected for direct access, the end of file condition doesn't arise.

What can you do to detect that the record isn't a valid number, beyond the end of the file? Not much, portably, but any positive number from iostat= indicates an error condition. You know now, though, what this particular 5002 means.


I should probably also add that the character variable for iomsg= is defined by the transfer statement only if there isn't success. Consider it only if you know the transfer failed.

Upvotes: 3

Related Questions