# Rules for List-Directed Sequential READ Statements

List-directed, sequential READ statements translate data from character to binary form by using the data types of the corresponding I/O list item to determine the form of the data. The translated data is then assigned to the entities in the I/O list in the order in which they appear, from left to right.

If a slash ( / ) is encountered during execution, the READ statement is terminated, and any remaining input list items are unchanged.

If the file is connected for unformatted I/O, list-directed data transfer is prohibited.

## List-Directed Records

A list-directed external record consists of a sequence of values and value separators. A value can be any of the following:

- A constant

  Each constant must be a literal constant of type integer, real, complex, logical, or character; or a nondelimited character string. Binary, octal, hexadecimal, Hollerith, and named constants are not permitted.

  In general, the form of the constant must be acceptable for the type of the list item. The data type of the constant determines the data type of the value and the translation from external to internal form. The following rules also apply:

  - A numeric list item can correspond only to a numeric constant, and a character list item can correspond only to a character constant. If the data types of a numeric list element and its corresponding numeric constant do not match, conversion is performed according to the rules for arithmetic assignment (see the table in Numeric Assignment Statements). Conversion is not performed between numeric and logical types unless compiler option assume old_logical_ldio is in effect. The decimal point in a numeric constant can either be a period if DECIMAL='POINT' or a comma if DECIMAL='COMMA'.

  - A complex constant has the form of a pair of real or integer constants separated by a comma if DECIMAL='POINT' or a semicolon if DECIMAL='COMMA' and enclosed in parentheses. Blanks can appear between the opening parenthesis and the first constant, before and after the separating comma or semicolon, and between the second constant and the closing parenthesis.

  - A logical constant represents true values (.TRUE. or any value beginning with T, .T, t, or .t) or false values (.FALSE. or any value beginning with F, .F, f, or .f).

  A character string does not need delimiting apostrophes or quotation marks if the corresponding I/O list item is of type default character, and the following is true:

  - The character string does not contain a blank, comma (,), or slash ( / ).

  - The character string is not continued across a record boundary.

  - The first nonblank character in the string is not an apostrophe or a quotation mark.

  - The leading character is not a string of digits followed by an asterisk.

  A nondelimited character string is terminated by the first blank, comma, slash, or end-of-record encountered. Apostrophes and quotation marks within nondelimited character strings are transferred as is.

- A null value

  A null value is specified by two consecutive value separators (such as,,) or a nonblank initial value separator. (A value separator before the end of the record does not signify a null value.)

  A null value indicates that the corresponding list element remains unchanged. A null value can represent an entire complex constant, but cannot be used for either part of a complex constant.

- A repetition of a null value (r*) or a constant (r*constant), where r is an unsigned, nonzero, integer literal constant with no kind parameter, and no embedded blanks.

A value separator is any number of blanks, a slash, or a comma if DECIMAL='POINT' or a semicolon if DECIMAL='COMMA', preceded or followed by any number of blanks. When any of these appear in a character constant, they are considered part of the character constant, not value separators.

The end of a record is equivalent to a blank character, except when it occurs in a character constant. In this case, the end of the record is ignored, and the character constant is continued with the next record (the last character in the previous record is immediately followed by the first character of the next record).

Blanks at the beginning of a record are ignored unless they are part of a character constant continued from the previous record. In this case, the blanks at the beginning of the record are considered part of the constant.

## Examples

Suppose the following statements are specified:

      CHARACTER*14 C
      DOUBLE PRECISION T
      COMPLEX D,E
      LOGICAL L,M
      READ (1,*) I,R,D,E,L,M,J,K,S,T,C,A,B

Then suppose the following external record is read:

      4 6.3 (3.4,4.2), (3, 2 ), T,F,,3*14.6,'ABC,DEF/GHI''JK'/

The following values are assigned to the I/O list items when DECIMAL='POINT':

I/O List Item | Value Assigned
--- | ---
I | 4
R | 6.3
D | (3.4,4.2)
E | (3.0,2.0)
L | .TRUE.
M | .FALSE.
J | Unchanged
K | 14
S | 14.6
T | 14.6D0
C | ABC,DEF/GHI`'` JK
A | Unchanged
B | Unchanged

With DECIMAL='COMMA', the following external record produces the same values as in the table above:

    4 6,3 (3,4;4,2); (3; 2 ); T;F;;3*14,6,'ABC,DEF/GHI''JK'/

The following example shows list-directed input and output:

     REAL    a
     INTEGER i
     COMPLEX c
     LOGICAL up, down
     DATA a /2358.2E-8/, i /91585/, c /(705.60,819.60)/
     DATA up /.TRUE./, down /.FALSE./
     OPEN (UNIT = 9, FILE = 'listout', STATUS = 'NEW')
     WRITE  (9, *) a, i
     WRITE  (9, *) c, up, down
     REWIND (9)
     READ   (9, *) a, i
     READ   (9, *) c, up, down
     WRITE  (*, *) a, i
     WRITE  (*, *) c, up, down
     END

The preceding program produces the following output:

       2.3582001E-05     91585
      (705.6000,819.6000) T F

Parent topic: Forms for Sequential READ Statements

## See Also

READ
Forms for Sequential READ Statements
Intrinsic Data Types for details on the literal constant forms of intrinsic data types
Rules for List-Directed Sequential WRITE Statements for details on list-directed output