我需要输入NPNOD,NELEM和其他值。并取下一个矩阵的值
IEnumerable
答案 0 :(得分:0)
最好先读取整行到一个字符串中,然后再从该字符串中读取相应的数值,以便在fortran中读取字符和数字的混合体。详细信息将在很大程度上取决于您处理变化的输入格式所需的灵活性。您越依赖于输入文件将始终具有相同结构的假设,事情就变得越容易。 您没有在问题中指定从1到8的行中的10个数字的详细信息。假设第一个数字是矩阵的行,第二个数字是当前矩阵的数字,其余的八个数字是元素。让我们进一步假设,矩阵的一行中的元素将始终在单个输入行中列出。
character(len=5), dimension(10) :: fields
character(len=80) :: string
character(len=1024) :: grand
integer, dimension(10) :: values
fields(1) = 'NPNOD' ! and so on ...
read(unit=ird, '(a)', iostat=ios) string ! read line 'DIMENSIONES...'
read(unit=ird, '(a)', iostat=ios) string ! read dummy string
grand(1:80) = string ! place into grand total
read(unit=ird, '(a)', iostat=ios) string ! read dummy string
grand(81:160) = string ! append to grand total
...! repeat for three more lines
grand(len_trim(grand)+1:len_trim(grand)+1) = ',' ! Append a final comma
do i=1,10 ! Loop over all field names
ilen = len_trim(field(i)) ! store length of field name, may vary?
ipos = index(grand, field(i)) ! Find start of field name
icom = index(grand(ipos+ilen+1:len(grand), ',') ! locate trailing comma
read(grand(ipos+ilen+1:ipos+ilen+icom-1),*) values(i) ! Read numerical value
enddo
read(unit=ird, '(a)', iostat=ios) string ! read dummy string
read(unit=ird, '(a)', iostat=ios) string ! read dummy string
read(unit=ird, '(a)', iostat=ios) string ! read dummy string
do i= 1, values(2) ! if NELEM is in fields(2)
read(ird, *) irow, imat, (array(i,j),j=1, values(2)) ! read leading two no's and elements
enddo
您仍然必须定义整数变量ird,ilen,ipos,icom,irow,imat,ios,i,j,矩阵数组或需要读取的许多矩阵。 读取后,应检查状态变量ios的值...
基本上,我会这样做: 用所有名称'NPNOD'定义一个字符变量字段... 读取并连接“ dimensiones”行,直到将“ INDSO”连接到字符串“ grand”中 遍历所有字段并 检测字段名称的位置和尾随逗号的位置 从大字符串中读取仅包含数值的小节 用矩阵元素在行上循环以读取两个第一个数字和矩阵元素。 当我附加最后一个逗号(在“ INDSO ...”行中缺少)时,字段名称上的循环不必打扰“ NPRES”的特殊情况,该特殊情况在原始名称中没有尾随逗号输入文件。 您的实际代码应 检查是否有不超过10个字段 任何单个输入行的最大长度为80个字符 串联列表将需要1024个字符。