Знаете ли вы, гарантируется ли следующее утверждение одним из стандартов Фортрана 90/95/2003?
«Предположим, что оператору чтения для символьной переменной дана пустая строка (т. Е. Она содержит только пробелы и символы новой строки). Если спецификатор формата - звездочка (*), он продолжает читать последующие строки до тех пор, пока не будет пустым строка найдена. Если спецификатор формата '(A)', вместо символьной переменной подставляется пустая строка. "
Например, посмотрите на следующую минимальную программу и входной файл.
код программы:
PROGRAM chk_read
INTEGER, PARAMETER :: MAXLEN=30
CHARACTER(len=MAXLEN) :: str1, str2
str1='minomonta'
read(*,*) str1
write(*,'(3A)') 'str1_start|', str1, '|str1_end'
str2='minomonta'
read(*,'(A)') str2
write(*,'(3A)') 'str2_start|', str2, '|str2_end'
END PROGRAM chk_read
входной файл:
----'input.dat' content is below this line----
yamanakako
kawaguchiko
----'input.dat' content is above this line----
Обратите внимание, что в файле input.dat четыре строки, а первая и третья строки не заполнены (содержат только пробелы и символы новой строки). Если я запускаю программу как
$ ../chk_read < input.dat > output.dat
Я получаю следующий вывод
----'output.dat' content is below this line----
str1_start|yamanakako |str1_end
str2_start| |str2_end
----'output.dat' content is above this line----
Первый оператор чтения для переменной 'str1', похоже, просматривает первую строку 'input.dat', находит пустую строку, переходит ко второй строке, находит значение символа 'yamanakako' и сохраняет его в 'str1'.
Напротив, второму оператору чтения для переменной 'str2', по-видимому, присваивается третья строка, которая является пустой, и сохраняется пустая строка в 'str2', не переходя к четвертой строке.
Я попытался скомпилировать программу с помощью Intel Fortran (ifort 12.0.4) и GNU Fortran (gfortran 4.5.0) и получил тот же результат.
Немного о том, как задать этот вопрос: я пишу подпрограмму для чтения файла данных, в котором в качестве разделителя блоков данных используется пустая строка. Я хочу убедиться, что пустая строка, и только пустая строка, выбрасывается при чтении данных. Мне также нужно сделать его стандартным и переносимым.
Спасибо за вашу помощь.