Fortran 95/2003 имеет множество функций обработки строк и файлов, которые делают это проще.
Например, этот фрагмент кода для обработки файла неизвестной длины:
use iso_fortran_env
character (len=100) :: line
integer :: ReadCode
ReadLoop: do
read (75, '(A)', iostat=ReadCode ) line
if ( ReadCode /= 0 ) then
if ( ReadCode == iostat_end ) then
exit ReadLoop
else
write ( *, '( / "Error reading file: ", I0 )' ) ReadCode
stop
end if
end if
! code to process the line ....
end do ReadLoop
Тогда код «обработать строку» может содержать несколько разделов в зависимости от логической переменной «Have_TURX». Если Have_TRUX имеет значение false, вы «ищете» ... проверьте, содержит ли строка «TURX». Вы можете использовать простое «==», если TURX всегда находится в начале строки, или для большей общности вы можете использовать встроенную функцию «index», чтобы проверить, содержит ли строка «line» TURX.
Когда программа находится в режиме Have_TRUX со значением true, вы используете «внутренний ввод / вывод» для считывания числового значения из строки. Поскольку целые числа имеют различную длину и выровнены по левому краю, самый простой способ - использовать «ввод-вывод по списку»: объединить их:
read (line, *) integer_variable
Затем вы могли бы снова использовать встроенную функцию «index», чтобы проверить, содержит ли строка также косую черту, и в этом случае вы меняете Have_TRUX на false и завершаете режим чтения.
Если вам нужно поместить числа в массив, может потребоваться дважды прочитать файл или вернуть его назад, потому что вам придется выделять массив, и вы не сможете сделать это, пока не узнаете размер массива. Или вы можете вставить цифры в связанный список, а затем, когда вы нажмете косую черту, выделить массив и заполнить его из связанного списка. Или, если существует известное максимальное количество значений, которые вы можете использовать во временном массиве, затем перенесите числа в выделяемый выходной массив. Это предполагает, что вы хотите, чтобы выходной аргумент подпрограммы был размещаемым массивом правильной длины, и он возвращает одну группу чисел за вызов:
integer, dimension (:), allocatable, intent (out) :: numbers
allocate (numbers (1: HowMany) )
P.S. Краткое описание возможностей языка приведено в http://en.wikipedia.org/wiki/Fortran_95_language_features, а в руководстве gfortran содержится краткое описание внутренних процедур, из которых вы можете узнать, какие встроенные функции доступны для обработки строк.