2016-08-24 6 views
0

У меня есть набор значений параметров для 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 
+1

Я не вижу объявления типа для mm - индексной переменной цикла do. Рассмотрим несколько строк из входного файла.Предполагая, что отсутствие объявления типа является проблемой транскрипции, общая проблема заключается в том, что открытый оператор открывает новый пустой файл в другом каталоге, где фактически находится файл. Убедитесь, что вы еще не создали файл с именем «species_parameters.txt» в другом месте, добавьте спецификатор STATUS = 'OLD' в ваш оператор open (который требует, чтобы файл был уже существующим) и повторите попытку. – IanH

+1

Я не понимаю - вы говорите, что при компиляции вы получаете ошибку во время выполнения? В коде, который не должен компилироваться. – talonmies

+0

Прошу прощения, моя ошибка - объявление переменной для mm является первой строкой моего скрипта, и я как-то ее оставил. Я отредактировал свой вопрос, чтобы добавить это. Так что мой код компилируется, и я все равно получаю ту же ошибку времени выполнения, когда пытался STATUS = 'OLD'. – UCLAEeb

ответ

2

Перспективы, когда у вас есть исполняемый файл, запустить его, и он выходит из строя. Ошибка времени компиляции - это когда компилятор не создает исполняемый файл.

Этот код не должен компилироваться, поскольку у вас есть IMPLICIT NONE, но не объявлено целое число mm.

То, что я рекомендовал бы, чтобы получить больше информации:

program driver 
    use iso_fortran_env 
    implicit none 
    character(len=7) :: species 
    real(kind=real64) :: leaf_variable, stem_variable, root_variable 
    integer :: u, ioerr 
    character(len=120) :: iomsg 

    open(newunit=u, file='species_parameters.txt', action='read', status='old', iostat=ioerr, iomsg=iomsg) 
    if (ioerr /= 0) then 
     print *, "Error opening file" 
     print *, trim(iomsg) 
     stop 1 
    end if 
    do 
     read(u, *, iostat=ioerr, iomsg=iomsg) species, leaf_variable, stem_variable, root_variable 
     if (ioerr /= 0) exit ! exits the loop 
     write(*, *) species, leaf_variable, stem_variable, root_variable 
    end do 
    print *, trim(iomsg) 
    close(u) 
end program driver 

Это всегда будет печатать «чтение после конца файла» ошибка, но это просто, чтобы проверить, как программа читает в любом случае.

Это должно скомпилироваться, и когда вы запустите его, оно должно дать вам некоторую информацию о том, что происходит не так.

+1

Для тестовых программ, подобных этому, лучший способ получить больше информации - просто оставить iostat от таких вещей, как инструкции ввода/вывода. Если возникает условие ошибки, процессор Fortran обычно предоставляет довольно информативное сообщение как часть завершения ошибки. Посмотрите на логику вокруг инструкции read в вашем примере - если во время чтения происходит ошибка, все, что делает ваша программа, тихо выйдет, и пользователь не будет знать, что что-то пошло не так. Если вы собираетесь поставлять IOSTAT, тогда также поставляйте (и сообщаете, когда iostat> 0) IOMSG. – IanH

+0

Спасибо за ваше предложение! Я забыл включить строку кода, которая объявила mm в моем вопросе, поэтому я отредактировал ее, чтобы добавить это. Ваш код скомпилирован и напечатал первую строку значений переменных, не возвращая условие ошибки. Но когда я попытался запустить его по всем строкам (с do mm = 1,22), ничего не напечатано, и он написал пустой файл с именем fort.1 .... знаете ли вы, что это значит? – UCLAEeb

+0

К сожалению, это должно быть (do mm = 1, 30) – UCLAEeb

 Смежные вопросы

  • Нет связанных вопросов^_^