Intel® Fortran Compiler Classic and Intel® Fortran Compiler Developer Guide and Reference

ID 767251
Date 11/07/2023
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

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

See Also