fcode 发表于 2018-11-2 09:48 谢谢大佬的耐心解答!我学习一下!十分感谢! |
[Fortran] 纯文本查看 复制代码 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 |
shurrik 发表于 2018-11-2 08:53 谢谢您,每行不会超过80个字符。 |
fcode 发表于 2018-11-2 08:38 fmesh4:n GEOM=xyz ORIGIN=-338.760 -338.760 -213.526 imesh= -161.342 -139.8575 -118.349 -96.840 -75.3315 -32.3035 32.3035 75.3315 96.840 118.349 139.8575 161.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.840 118.349 139.8575 161.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.44 121.92 152.4 182.880 212.410 kints= 2 1 1 1 1 1 1 1 1 1 1 1 1 2 out=col |
你给一个复制粘贴的数据文件(或部分),不要截图。 |
fcode 发表于 2018-11-1 18:17 谢谢您的回复,小弟Fortran新手,请大佬赐教,谢谢您! 1:关键字的顺序可以变,也可以不变。名称和长度确定是不变的。 2:关键字后面的个数部分是确定的,部分是不确定的。 3:关键字后面的数据,希望放在不同的数组。 4:这段输入inp是一个计算程序的输入,我找源代码看了很久,读入数据的代码很灵活,遍布整个程序,实在看不太懂。所以希望简单,死板一点吧。 谢谢大佬您的帮助。 |
像这种“异形”文本文件的读取,可以很简单,也可以很复杂。 取决于一些事情,比如: 1. 数据文件中关键字的顺序,名称,长度是否是确定不变的? 2. 关键字后面的数据的个数是否是确定不变的?你是否能够事先判定有多少个?3. 不同关键字后面的数据,你要如何存储?是放在同一个数组,还是多个不同的数组,还是一个结构体? 4. 你想要写得非常死板?还是非常灵活? |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-12-23 20:54