Чтение реальных значений переменной длины в фортране - PullRequest
0 голосов
/ 11 июня 2018

У меня есть файл со следующим текстом:

-1.065211      246.0638 xlo xhi
-0.615       245.385 ylo yhi
-10 10 zlo zhi

Я хочу прочитать числовые значения в строках в реальной матрице 3 * 2.
Можно ли прочитать только два вводазаписи и перейти к следующей строке?Что-то вроде:
read(1,'(2F?.?/)') (matrix(i,1:2),i=1,3)
Я поставил вопросительные знаки в F?.?потому что длина моих чисел является переменной.Другими словами, мне нужно прочитать только два элемента записи в свободном формате.Я понимаю, что вы можете сделать это с помощью цикла.Мне интересно, возможна ли простая однострочность.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Код в ответе @ Steve является самым простым, который может выполнить то, что вы хотите.Если вы хотите его в одну строку , вы можете просто

do i=1,3 ; read(fd,*) matrix(i,:) ; end do

Если вы ищете способ ", прочитайте только два ввода записи и перейдите кследующая строка " только с одним оператором , то есть, насколько мне известно, невозможно: поскольку ваши реальные значения имеют разные форматы, вам нужно использовать ввод по списку (звездочка в формате) для чтения нескольких строк с одним и тем же оператором (все другие форматы для вещественных чисел требуют положительной ширины для ввода, и так как ваши действительные значения имеют различную ширину, любая спецификация ширины приведет к ошибке времени выполнения).

Если вы хотите использовать только один оператор, вам нужно будет явно указать программе, что нужно прочитать две строки в конце каждой строки, даже если они отбрасываются (в противном случае программа попытается запустить строку в вещественное число, иэто приведет к ошибке во время выполнения):

character(len=10) :: r
read(1,*) (a(i,:),r,r,i=1,3)

Это менее общий код, чем код @ Steve (требуется, чтобы у вас было ровно 2 строки символов на строкуд) и фактически требует дополнительного объявления символьной переменной.

Наконец, обратите внимание, что вы не читаете массив в порядке следования элементов: в Фортране порядок элементов массива в памяти равенa(1,1), a(2,1), a(3,1), a(1,2) и т. Д. Если фактические массивы, которыми вы планируете манипулировать, намного больше, порядок индексов может существенно повлиять на производительность, поскольку последовательный доступ к памяти может затрагивать удаленные частипамяти, а не смежные части этого.Когда вы пишете программу на Фортране, как и на любом другом языке (который может использовать другой порядок), вам необходимо подумать о порядке индексов массивов.

0 голосов
/ 11 июня 2018

Вы можете достичь желаемого с помощью

do i = 1, 3
   read(fd,*) matrix(i,:)
end do

, где предполагается, что fd подключен к файлу, содержащему ваши данные.

...