Я хотел бы прочитать координаты из входного файла.Пример входного файла будет выглядеть примерно так:
1 0.1542 0.2541 1.2451 N
12 4.5123 2.0014 2.0154 O
43 8.2145 0.2978 4.2165 H
и т.д ... Размер этого файла является переменным.Первый столбец - это число, присвоенное атому, следующие столбцы - его координаты x, y, z, а последний столбец - элементарный символ атома.
Я пробовал что-то вроде:
integer, allocatable :: atnum(:)
double precision, allocatable :: coord(:,:)
character(len=2), allocatable :: element(:)
open(unit=20, file='input', status='old',action='read')
read(20,*,end=200) atnum, coord(:,1:3), element
200 close(20)
Это выдает мне ошибку:
Fortran runtime error: Bad integer for item 2 in list input
Я предполагаю, что программа прочитала первую запись в atnum(1)
, но затем попытался продолжить чтение во второй записи первого ряда в atnum(2)
.Как я могу заставить его правильно читать входные данные?
Я также думаю, что может быть проблема с указанием программе прочитать три средних столбца в coord(:,1:3)
.Вполне вероятно, что он прочитает первые три записи в coord(1,1), coord(2,1), coord(3,1)
, затем натолкнется на символ в конце строки и снова запутается.Как я могу сказать ему исправить первый индекс строки и прочитать в другое измерение?Или мне придется поменять местами индексы, например coord(1:3,:)
?Будет ли это работать?
РЕДАКТИРОВАТЬ: выше сказанное tpg2114, но у меня все еще есть проблема.Я не могу выделить массив, пока не узнаю, сколько наборов координат нужно прочитать, но я знаю только, сколько атомов, пока не достигну конца файла.Программа компилируется нормально, если я не выделяю atnum, coord and element
, но возвращает ошибку сегментации, когда я пытаюсь ее запустить.Как я могу заставить его считывать динамические массивы без предварительного их выделения?
Звучит примерно так: Массивы переменного размера в Fortran без Allocate ()
Заранее спасибо.