我在将字符串转换为整数数组时提供了一个示例。我使用索引范围传递数组。偏移量由0而不是1启动,因此数组中的值将被移位。
s = "1,2,3,5,8"
Call str_to_num_tu (s, ",", tu(1:8))
$ Output:
$ tu(1): 0 ; tu(2): 1 ; tu(3): 2
Call str_to_num_tu (s, ",", tu)
$ Output:
$ tu(i): 1 ; tu(2): 2 ; tu(3): 3
这是我使用无限多态变量的子程序。
Subroutine str_to_num_tu &
( &
s, dl, tu, pos &
)
Class(*), Intent (InOut) :: tu(:)
Character (len=*), Intent (In) :: s, dl
Character (len=*), Intent (In), Optional :: pos
Integer, Allocatable :: ipos(:)
Integer :: nf, npos, ip, i, j, k
!!$ Sets tu.
!!$ s = "Pablo/Neruda"; tu = ["Pablo","Neruda"]
!!$ s = "0.2/1.3/1.5"; tu = [0.2,1.3,1.5]
nf = nfields (s, dl)
Write (*,*) ""
Write (*,*) "nf: ", nf, "; Size(tu): ", Size(tu)
i = 1
Do k = 1, nf-1
j = Index (s(i:), dl)
Select Type (tu)
Type Is (Integer (Int32))
Call str_to_num (s(i:i+j-2), tu(k))
Write (*,*) Trim (s(i:))
Write (*,*) "k: ", k, "; tu(k): ", tu(k)
End Select !!$ tu
i = i + j
End Do
!!$ Gets last field.
j = Index (s, dl, back=.true.)
Write (*,*) "j:", j, "; nf:", nf
Select Type (tu)
Type Is (Integer (Int32))
Call str_to_num (s(j+1:), tu(nf))
End Select !!$ tu
End Subroutine str_to_num_tu
答案 0 :(得分:2)
详细说明我之前的评论。 (我在这台计算机上没有Fortran,所以语法可能有点难以理解。)我的意思是这样的东西
integer, dimension(6), allocatable :: arr
integer :: ios
character(len=:), allocatable :: str
...
arr = 0
str = "1,2,3,5,8"
read(str,*,iostat=ios) arr
会将str
中的前6个整数读入arr
的元素。碰巧str
只有5个整数,因此arr
的最后一个元素保留为0
。此处需要iostat
,因为尝试读取比str
提供的更多整数会在运行时产生文件结束错误。
当然,这种方法也可以归结为实数,字符和逻辑。 Fortran具有内置类型的多态读取。一点。
Fortran会将空格和空格识别为值分隔符(Fortran标准使用单词 delimiter 表示其他内容)。请注意,通过将i / o语句上的decimal
模式设置为comma
,Fortran会将逗号识别为小数点,并将分号;
视为值分隔符。从技术上讲,斜杠也是一个值分隔符,但它也会导致记录的列表导向输入终止,因此实际上并不像值分隔符。
如果担心包含其他值分隔符的字符串,我可能会编写一个函数,该函数接受一个包含此类的字符串,返回一个只有空格的字符串,然后对其执行内部读取。