数据读入问题,请大神帮忙!
各位好,请问一下如图的数据怎么读入数组呢?基本上都有关键字,然后将关键字后的数或数组读入到程序数组中。其中的"C" 是注释的意思,该行的后续不再读入。求大神指教!谢谢!像这种“异形”文本文件的读取,可以很简单,也可以很复杂。
取决于一些事情,比如:
1. 数据文件中关键字的顺序,名称,长度是否是确定不变的?
2. 关键字后面的数据的个数是否是确定不变的?你是否能够事先判定有多少个?3. 不同关键字后面的数据,你要如何存储?是放在同一个数组,还是多个不同的数组,还是一个结构体?
4. 你想要写得非常死板?还是非常灵活?
fcode 发表于 2018-11-1 18:17
像这种“异形”文本文件的读取,可以很简单,也可以很复杂。
取决于一些事情,比如:
1. 数据文件中关键字 ...
谢谢您的回复,小弟Fortran新手,请大佬赐教,谢谢您!
1:关键字的顺序可以变,也可以不变。名称和长度确定是不变的。
2:关键字后面的个数部分是确定的,部分是不确定的。
3:关键字后面的数据,希望放在不同的数组。
4:这段输入inp是一个计算程序的输入,我找源代码看了很久,读入数据的代码很灵活,遍布整个程序,实在看不太懂。所以希望简单,死板一点吧。
谢谢大佬您的帮助。 你给一个复制粘贴的数据文件(或部分),不要截图。 fcode 发表于 2018-11-2 08:38
你给一个复制粘贴的数据文件(或部分),不要截图。
fmesh4:n GEOM=xyzORIGIN=-338.760 -338.760 -213.526
imesh= -161.342-139.8575-118.349-96.840-75.3315-32.3035
32.3035 75.3315 96.840118.349139.8575161.3420
338.760
iints=5 1 1 1 1 2 3 2 1 1 1 1 5
c
jmesh= -161.342-139.8575-118.349-96.840-75.3315-32.3035
32.3035 75.3315 96.840118.349139.8575161.3420
338.760
c
jints=5 1 1 1 1 2 3 2 1 1 1 1 5
kmesh=-182.880 -152.40-121.92-91.44-60.96-30.48 0.00000
30.48 60.96 91.44121.92 152.4 182.880 212.410
kints=2 1 1 1 1 1 1 1 1 1 1 1 1 2
out=col shurrik 发表于 2018-11-2 08:53
fmesh4:n GEOM=xyzORIGIN=-338.760 -338.760 -213.526
imesh= -161.342-139.8575-118.34 ...
谢谢您,每行不会超过80个字符。 Module typedef
Implicit None
private
Integer , parameter :: N = 13
type , public :: ST_Mesh
character(len=12) :: geom , out
real :: origin(3)
real :: iMesh(N) , jMesh(N) , kMesh(N)
Integer :: iInts(N) , jInts(N) , kInts(N)
contains
Procedure :: ReadFrom
end type ST_Mesh
contains
Logical Function ReadFrom( this , fu ) result( bOK )
Class(ST_Mesh) :: this
Integer , Intent(IN) :: fu
character(len=2560):: buf !//足够大的缓冲
character(len=512) :: cRead
integer :: i , j , m , k , n
bOK = .false.
n = 0
Do
Read( fu , "(a512)" , ioStat = k ) cRead
if( k/=0 ) exit
!if( ) exit //其他停止依据,可添加在这
k = len_trim(cRead)
if( k <= 0 ) cycle
buf(n+1:) = trim(cRead)
n = n + k + 1
buf(n:n) = " "
End Do
if( n <= 0 ) return
j = 1
Do
k = Index( buf(j:) , '=' )
if( k < 2 ) exit
m = k + j - 1
i = Index( buf(:m) , ' ' , .true. )
if( i < 0 ) exit
Select Case( buf(i+1:m-1) )
Case( 'GEOM' )
Read( buf(m+1:) , * , ioStat = k ) this%geom
Case( 'ORIGIN' )
Read( buf(m+1:) , * , ioStat = k ) this%origin
Case( 'imesh' )
Read( buf(m+1:) , * , ioStat = k ) this%imesh
Case( 'iints' )
Read( buf(m+1:) , * , ioStat = k ) this%iints
Case( 'jmesh' )
Read( buf(m+1:) , * , ioStat = k ) this%jmesh
Case( 'jints' )
Read( buf(m+1:) , * , ioStat = k ) this%jints
Case( 'kmesh' )
Read( buf(m+1:) , * , ioStat = k ) this%kmesh
Case( 'kints' )
Read( buf(m+1:) , * , ioStat = k ) this%kints
Case( 'out' )
Read( buf(m+1:) , * , ioStat = k ) this%out
End Select
if( k/=0 ) return
j = m + 1
End Do
bOK = .true.
End Function ReadFrom
End Module typedef
Program Main
use typedef
Implicit None
type( ST_Mesh ) :: mesh
Logical :: ok
Open(12,File="File.txt")
ok = mesh%ReadFrom(12)
if( ok ) write(*,*) mesh
Close(12)
End Program Main fcode 发表于 2018-11-2 09:48
Module typedef
Implicit None
private
谢谢大佬的耐心解答!我学习一下!十分感谢!
页:
[1]