Как прочитать файл данных с неизвестной структурой в FORTRAN? - PullRequest
1 голос
/ 06 января 2012

Мне нужно прочитать файлы, которые содержат неопределенное количество ячеек и для каждой ячейки неизвестное количество пар данных. Я использую Фортран.

Файл выглядит так:

Cell Number 1
Depth1 Volume1
Depth2 Volume2
Depth3 Volume3
.
.
.
Cell Number N
Depth1 Volume1
Depth2 Volume2
Depth3 Volume3
Depth4 Volume4
Depth5 Volume5

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

4 голосов
/ 06 января 2012

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

Но есть также проблема того, как хранить данные после того, как вы их прочитали ... Поскольку у вас есть как неизвестное количество ячеек, так и неизвестное количество элементов данных на ячейку, самый элегантный подход заключается в создании типа связанного списка для каждого. Чтобы иметь список ячеек, и когда вы встретите новую ячейку, добавьте в этот список. И сам тип ячейки содержит список типа данных ячейки. Когда вы встречаете новый элемент данных, вы добавляете в этот список. Связанный список, вероятно, является лучшим способом обработки неизвестного количества элементов. Недавний вопрос касался связанных списков в Fortran: Как я могу реализовать связанный список в Fortran 2003-2008 . В противном случае вы можете прочитать файл, перемотать назад или вернуться назад и выделить массивы правильного размера, а затем перечитать. Примитивный способ состоит в том, чтобы иметь массивы фиксированной длины типов, рассчитанных на максимально возможное количество ячеек, и максимально возможное количество элементов данных на ячейку. Просто, но очень не элегантно. И подвержен ошибкам, если ваше предположение о максимальном количестве неверно.

2 голосов
/ 06 января 2012

какую версию фортрана вы используете?95?

читать как символ (len = 1000) или что-то достаточно длинное, а затем читать из этой переменной.

program xx
character(len=1000) :: buf
integer :: celnum
open(11,file='dat.txt',status='old')

do
   read(11,'(a)') buf
   print*,buf(1:12)
   if (buf(1:12)=='Cell Number ') then
     read(buf(13:1000), *) celnum
     print *, celnum
   elseif (buf(1:5) == 'Depth') then
     ! here it is not clear what I am suppose to read
   else
     print*,'que?'
     stop
   endif

enddo
end
...