Как предлагается в комментариях, мы можем заменить /
пробелом, используя sed
et c. Мы также можем сканировать каждый символ один за другим в Фортране (см. Ниже). Затем мы читаем все целые числа в vals
и выбираем нужную часть как vals( 1:6:2 )
. Аналогичный подход можно использовать для f a//b//c d//e//f ...
et c, изменив 1: 6: 2 на 1: 12: 3 et c.
[test.f90]
program main
implicit none
character(100) buf
integer vals(10), ios, i
open(10, file="test.dat", status="old")
do
read(10, "(a)", iostat=ios) buf
if (ios /= 0) exit
do i = 1, len(buf)
if (buf(i:i) == "/") buf(i:i) = " " !! replace "/" by " "
enddo
read(buf(2:), *) vals( 1:6 ) !! read all items
print *, vals( 1:6:2 ) !! select items 1, 3, 5
enddo
close(10)
end
[test.dat]
f 297//763 298//763 296//763
f 296//764 298//764 295//764
f 384//765 385//765 382//765
f 384//766 382//766 383//766
$ gfortran test.f90 && ./a.out
297 298 296
296 298 295
384 385 382
384 382 383
Просто для удовольствия, вот аналогичный код в Python, который короче благодаря replace()
и split()
. Если у нас есть похожие программы, я думаю, что приведенный выше код также может стать короче.
dat = []
for line in open("test.dat").readlines():
dat.append( line[1:] .replace("/", " ") .split() [::2] )
import numpy as np
face = np.array(dat, dtype=int)
print(face)
$ python test.py
[[297 298 296]
[296 298 295]
[384 385 382]
[384 382 383]]