У меня есть набор значений параметров для 30 видов, и я хочу запустить скрипт, который проводит симуляцию для каждого вида. Значения параметров в настоящее время хранятся в файле .txt, где каждая строка является другим видом, и каждый столбец представляет собой другое значение параметра. То, что я хотел бы сделать, - создать do-loop, который читает в соответствующей строке значений параметров для каждого вида, запускает сценарий моделирования и записывает .txt-файл вывода для каждого вида. К сожалению, я новичок в fortran и испытываю большие трудности с пониманием того, как читать последовательные строки из TXT-файла на каждом этапе цикла do. Я попытался сделать упрощенный сценарий, чтобы проверить, был ли работать прочитанный шаг:Как читать в последовательной строке текстового файла на каждом шаге do-loop в fortran?
PROGRAM DRIVER
IMPLICIT NONE
INTEGER :: mm ! I forgot this line in the first version of this question
and edited to add it in
CHARACTER(7) :: species !! the first column is the species name
REAL*8 :: leaf_variable ! The next 3 columns are variable values
REAL*8 :: stem_variable !
REAL*8 :: root_variable !
OPEN (12, file = "species_parameters.txt") ! open the .txt file
DO mm = 1,30 ! set up the do loop
READ (12,*) species, leaf_variable, stem_variable, root_variable
! Read in the species-specific parameter values
WRITE (*,*) species, leaf_variable, stem_variable, root_variable
! Print the values on the screen just to show the do loop runs
ENDDO
END PROGRAM DRIVER
Но когда я иду к компиляции, я получаю ошибку: На линии Х-Х файла XX (единица = 12, файловых = «species_parameters .txt ') Ошибка выполнения Fortran: Конец файла
Что я не понимаю об открытии и чтении в этом файле?
Большое спасибо за любую помощь.
EDIT: Я думаю, что я сузил свою проблему. Я понимаю, что для чтения() принимает в одной строке в текстовом файле, в то время, так что в этом примере:
read(7, *) species, leaf_variable, stem_variable, root_variable
read(7, *) species, leaf_variable, stem_variable, root_variable
Переменные должны быть равны значения во второй строке текстового файла. Вместо этого, независимо от того, сколько раз я добавляю в функцию read(), значения переменных равны первой строке. И, несмотря на то, есть только 4 колонки, я могу определить, как много переменных, как я хочу с функцией чтения():
read(7, *) species, leaf_variable, stem_variable, root_variable,
fake_variable1, fake_variable2, fake_variable3, fake_variable4
где fake_variable значения, равные значения во второй строке файла .txt. Я запутался в том, что делает read(), или есть что-то, что мне нужно сделать, чтобы мой скрипт не читал мой весь .txt-файл как одну строку?
РЕДАКТИРОВАТЬ # 2: Петля do считывает строковые строки правильно, теперь я сохранил мой .txt-файл с кодировкой Unix с помощью TextWrangler. Исходный файл был сохранен как .txt-файл с Excel. Кажется, это решило, но если у кого-то есть предложения по улучшению способа ввода формата входного файла, я был бы признателен. Первые несколько строк входного файла выглядят следующим образом: ошибка время
species1,1.2,6.54,10.9
species2,1.42,3.5,8.23
species3,0.85,2.41,4.9
Я не вижу объявления типа для mm - индексной переменной цикла do. Рассмотрим несколько строк из входного файла.Предполагая, что отсутствие объявления типа является проблемой транскрипции, общая проблема заключается в том, что открытый оператор открывает новый пустой файл в другом каталоге, где фактически находится файл. Убедитесь, что вы еще не создали файл с именем «species_parameters.txt» в другом месте, добавьте спецификатор STATUS = 'OLD' в ваш оператор open (который требует, чтобы файл был уже существующим) и повторите попытку. – IanH
Я не понимаю - вы говорите, что при компиляции вы получаете ошибку во время выполнения? В коде, который не должен компилироваться. – talonmies
Прошу прощения, моя ошибка - объявление переменной для mm является первой строкой моего скрипта, и я как-то ее оставил. Я отредактировал свой вопрос, чтобы добавить это. Так что мой код компилируется, и я все равно получаю ту же ошибку времени выполнения, когда пытался STATUS = 'OLD'. – UCLAEeb