У меня есть набор данных значений параметров для 30 видов, и я хочу запустить скрипт, который проводит моделирование для каждого вида. Значения параметров в настоящее время хранятся в файле .txt, где каждая строка представляет собой отдельный вид, а каждый столбец — другое значение параметра. Что я хотел бы сделать, так это настроить цикл выполнения, который считывает соответствующую строку значений параметров для каждого вида, запускает сценарий моделирования и записывает файл .txt с выходными данными для каждого вида. К сожалению, я новичок в фортране, и у меня много проблем с пониманием того, как читать последовательные строки из файла .txt на каждом этапе цикла выполнения. Я попытался сделать упрощенный скрипт, чтобы проверить, работает ли шаг чтения:
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 файла XX (unit = 12, file = 'species_parameters.txt') Ошибка времени выполнения Fortran: конец файла
Что я неправильно понимаю в открытии и чтении этого файла?
Большое спасибо за любую помощь.
РЕДАКТИРОВАТЬ: я думаю, что сузил свою проблему. Насколько я понимаю, read() принимает по одной строке в файле .txt за раз, так что в этом примере:
read(7, *) species, leaf_variable, stem_variable, root_variable
read(7, *) species, leaf_variable, stem_variable, root_variable
Переменные должны совпадать со значениями во второй строке файла .txt. Вместо этого, независимо от того, сколько раз я ввожу функцию read(), значения переменных равны первой строке. И хотя столбцов всего 4, я могу определить столько переменных, сколько захочу, с помощью функции read():
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
species_parameters.txt
в другом неожиданном месте, добавьте спецификатор STATUS='OLD' в оператор open (для которого требуется, чтобы файл уже существовал) и повторите попытку. - person IanH   schedule 24.08.2016*
для второго спецификатора, указывающего спецификацию формата, как и у вас — считывает столько полных записей из файла, сколько необходимо для обработки всех элементов входного списка. Если ваши входные данные (которых мы еще не видели — следовательно, все догадываются!) содержат данные только для четырех элементов в записи, а во входном списке в операторе восемь элементов, то чтение будет читать две записи. Покажите свой фактический код и ваш фактический ввод !!!! - person IanH   schedule 25.08.2016