Fortran Coder

查看: 12011|回复: 7
打印 上一主题 下一主题

[文件读写] 数据读入问题,请大神帮忙!

[复制链接]

5

帖子

1

主题

0

精华

入门

F 币
35 元
贡献
16 点
跳转到指定楼层
楼主
发表于 2018-11-1 15:35:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
各位好,请问一下如图的数据怎么读入数组呢?基本上都有关键字,然后将关键字后的数或数组读入到程序数组中。其中的"C" 是注释的意思,该行的后续不再读入。求大神指教!谢谢!

QQ图片20181101153214.png (22.58 KB, 下载次数: 309)

QQ图片20181101153214.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2018-11-1 18:17:48 | 只看该作者
像这种“异形”文本文件的读取,可以很简单,也可以很复杂。
取决于一些事情,比如:
1. 数据文件中关键字的顺序,名称,长度是否是确定不变的?
2. 关键字后面的数据的个数是否是确定不变的?你是否能够事先判定有多少个?3. 不同关键字后面的数据,你要如何存储?是放在同一个数组,还是多个不同的数组,还是一个结构体?
4. 你想要写得非常死板?还是非常灵活?

5

帖子

1

主题

0

精华

入门

F 币
35 元
贡献
16 点
板凳
 楼主| 发表于 2018-11-2 08:11:44 | 只看该作者
fcode 发表于 2018-11-1 18:17
像这种“异形”文本文件的读取,可以很简单,也可以很复杂。
取决于一些事情,比如:
1. 数据文件中关键字 ...

谢谢您的回复,小弟Fortran新手,请大佬赐教,谢谢您!
1:关键字的顺序可以变,也可以不变。名称和长度确定是不变的。
2:关键字后面的个数部分是确定的,部分是不确定的。
3:关键字后面的数据,希望放在不同的数组。
4:这段输入inp是一个计算程序的输入,我找源代码看了很久,读入数据的代码很灵活,遍布整个程序,实在看不太懂。所以希望简单,死板一点吧。
谢谢大佬您的帮助。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2018-11-2 08:38:18 | 只看该作者
你给一个复制粘贴的数据文件(或部分),不要截图。

5

帖子

1

主题

0

精华

入门

F 币
35 元
贡献
16 点
5#
 楼主| 发表于 2018-11-2 08:53:21 | 只看该作者
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

5

帖子

1

主题

0

精华

入门

F 币
35 元
贡献
16 点
6#
 楼主| 发表于 2018-11-2 08:53:56 | 只看该作者
shurrik 发表于 2018-11-2 08:53
fmesh4:n   GEOM=xyz  ORIGIN=-338.760 -338.760 -213.526
        imesh= -161.342  -139.8575  -118.34 ...

谢谢您,每行不会超过80个字符。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

7#
发表于 2018-11-2 09:48:25 | 只看该作者
[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

5

帖子

1

主题

0

精华

入门

F 币
35 元
贡献
16 点
8#
 楼主| 发表于 2018-11-2 10:08:58 | 只看该作者
fcode 发表于 2018-11-2 09:48
[mw_shl_code=fortran,true]Module typedef
  Implicit None
  private

谢谢大佬的耐心解答!我学习一下!十分感谢!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-26 23:33

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表