, знаете ли вы, если следующее утверждение гарантировано одним из стандартов fortran 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) и получил тот же результат.
Немного об истории вопроса: я пишу подпрограмму для чтения файла данных, который использует пустую строку в качестве разделителя блоков данных. Я хочу убедиться, что пустая строка и только пустая строка выбрасываются при чтении данных. Мне также нужно сделать его стандартным и портативным.
Спасибо за вашу помощь.