# Forms and Rules for Internal READ Statements

Internal READ statements transfer input data from an internal file.

An internal READ statement can only be formatted. It must include format specifiers (which can use list-directed formatting). Namelist formatting is also permitted.

An internal READ statement takes one of the following forms:

READ (iunit, format [, nml-group] [, iostat] [, err] [, end] [, iomsg]) [io-list]

READ (iunit, nml-group [, iostat] [, err] [, end] [, iomsg]) [io-list]

For more information on syntax, see READ.

Formatted, internal READ statements translate data from character to binary form by using format specifications for editing (if any). The translated data is assigned to the entities in the I/O list in the order in which the entities appear, from left to right.

This form of READ statement behaves as if the format begins with a BN edit descriptor. (You can override this behavior by explicitly specifying the BZ edit descriptor.)

Values can be transferred to objects of intrinsic or derived types. For derived types, values of intrinsic types are transferred to the components of intrinsic types that ultimately make up these structured objects.

Before data transfer occurs, the file is positioned at the beginning of the first record. This record becomes the current record.

If the number of I/O list items is less than the number of fields in an input record, the statement ignores the excess fields.

If the number of I/O list items is greater than the number of fields in an input record, the input record is padded with blanks. However, if PAD='NO' was specified for file connection, the input list and file specification must not require more characters from the record than it contains.

In list-directed and namelist formatting, character strings have no delimiters.

## Examples

The following program segment reads a record and examines the first character to determine whether the remaining data should be interpreted as decimal, octal, or hexadecimal. It then uses internal READ statements to make appropriate conversions from character string representations to binary.

    INTEGER IVAL
    CHARACTER TYPE, RECORD*80
    CHARACTER*(*) AFMT, IFMT, OFMT, ZFMT
    PARAMETER (AFMT='(Q,A)', IFMT= '(I10)', OFMT= '(O11)',        &  ZFMT= '(Z8)')
    ACCEPT AFMT, ILEN, RECORD
    TYPE = RECORD(1:1)
    IF (TYPE .EQ. 'D') THEN
        READ (RECORD(2:MIN(ILEN, 11)), IFMT) IVAL
    ELSE IF (TYPE .EQ. 'O') THEN
        READ (RECORD(2:MIN(ILEN, 12)), OFMT) IVAL
    ELSE IF (TYPE .EQ. 'X') THEN
        READ (RECORD(2:MIN(ILEN, 9)),ZFMT) IVAL
    ELSE
        PRINT *, 'ERROR'
    END IF
    END

Parent topic: Forms for READ Statements

## See Also

I/O control-list specifiers
I/O lists
Rules for List-Directed Sequential READ Statements for details on list-directed input
Rules for Namelist Sequential READ Statement for details on namelist input