Fortran 95 / 2003 有很多字符串和文件处理功能,使这更容易。
例如,此代码片段用于处理未知长度的文件:
use iso_fortran_env
character (len=100) :: line
integer :: ReadCode
ReadLoop: do
read (75, '(A)', iostat=ReadCode ) line
if ( ReadCode /= 0 ) then
if ( ReadCode == iostat_end ) then
exit ReadLoop
else
write ( *, '( / "Error reading file: ", I0 )' ) ReadCode
stop
end if
end if
! code to process the line ....
end do ReadLoop
然后“处理行”代码可以包含几个部分,具体取决于逻辑变量“Have_TURX”。如果 Have_TRUX 为假,您正在“寻找”...测试该行是否包含“TURX”。如果 TURX 始终位于字符串的开头,则可以使用普通的“==”,或者为了更通用,您可以使用内部函数“index”来测试字符串“line”是否包含 TURX。
一旦程序处于模式 Have_TRUX 为真,然后您使用“内部 I/O”从字符串中读取数值。由于整数具有不同的长度并且左对齐,因此最简单的方法是使用“列表导向 I/O”:结合这些:
read (line, *) integer_variable
然后您可以再次使用内部函数“index”来测试字符串是否还包含斜杠,在这种情况下,您将 Have_TRUX 更改为 false 并结束阅读模式。
如果您需要将数字放入数组中,则可能需要读取文件两次,或者退格文件,因为您必须分配数组,并且在您知道数组的大小之前无法执行此操作大批。或者你可以将数字弹出到一个链表中,然后当你点击斜线时分配数组并从链表中填充它。或者,如果已知最大数量的值,您可以使用临时数组,然后将这些数字传输到可分配的输出数组。这是假设您希望子例程的输出参数是正确长度的可分配数组,并且每次调用返回一组数字:
integer, dimension (:), allocatable, intent (out) :: numbers
allocate (numbers (1: HowMany) )
PS 在http://en.wikipedia.org/wiki/Fortran_95_language_features有语言特性的简要总结,gfortran 手册有内在过程的总结,从中您可以看到哪些内置函数可用于字符串处理.