Fortran Coder

查看: 75|回复: 12

[文件读写] 读取文本文件内的指定内容,且指定内容位置不固定。

[复制链接]

16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
发表于 2020-3-16 17:44:20 | 显示全部楼层 |阅读模式
这是marc有限元生成的输出文件,我想要读取其中的points,coordinates和coonectivity并输出到另一个文件中。
[HTML] 纯文本查看 复制代码
title               job1
$....MARC input file produced by Marc Mentat 2017.1.0 (64bit)
$...................................
$....input file using extended precision
extended
$...................................
sizing                                 0       100       121         0
alloc                       25
elements                     3
version                     13
table                        0         0         2         1         1         0         0         1
processor                    1         1         1         0
$no list
all points
no echo                      1         2         3
end
$...................
solver
         8         0         0         0         0         0         0         0         0         0         0         0         0         0         0         0
optimize                    11
points

         7 1.000000000000000+0 0.000000000000000+0 0.000000000000000+0
         8 1.000000000000000+1 0.000000000000000+0 0.000000000000000+0
        15 6.12323399573677-17 1.000000000000000+0 0.000000000000000+0
        16 0.000000000000000+0 1.000000000000000+1 0.000000000000000+0
connectivity
         0         0         1         0         1         1         0         0         0
         1         3        12        13         2         1
         2         3        13        14         3         2
         3         3        14        15         4         3
         4         3        15        16         5         4
         5         3        16        17         6         5
         6         3        17        18         7         6
         7         3        18        19         8         7
         8         3        19        20         9         8
         9         3        20        21        10         9
        10         3        21        22        11        10
        11         3        23        24        13        12
        12         3        24        25        14        13
        13         3        25        26        15        14
        14         3        26        27        16        15
        15         3        27        28        17        16
        16         3        28        29        18        17
        17         3        29        30        19        18
        18         3        30        31        20        19
        19         3        31        32        21        20
        20         3        32        33        22        21
        21         3        34        35        24        23
        22         3        35        36        25        24
        23         3        36        37        26        25
        24         3        37        38        27        26
        25         3        38        39        28        27
        26         3        39        40        29        28
        27         3        40        41        30        29
        28         3        41        42        31        30
        29         3        42        43        32        31
        30         3        43        44        33        32
        31         3        45        46        35        34
        32         3        46        47        36        35
        33         3        47        48        37        36
        34         3        48        49        38        37
        35         3        49        50        39        38
        36         3        50        51        40        39
        37         3        51        52        41        40
        38         3        52        53        42        41
        39         3        53        54        43        42

coordinates
         3       121         0         1
         1 1.000000000000000+0 0.000000000000000+0 0.000000000000000+0
         2 9.894434504817674-1 1.449194890231615-1 0.000000000000000+0
         3 9.558632461069742-1 2.938119377115879-1 0.000000000000000+0
         4 8.973756499953726-1 4.412674277525846-1 0.000000000000000+0
         5 8.138260360510751-1 5.811085811149188-1 0.000000000000000+0
         6 7.071067811865476-1 7.071067811865476-1 0.000000000000000+0
         7 5.811085811149190-1 8.138260360510753-1 0.000000000000000+0
         8 4.412674277525846-1 8.973756499953726-1 0.000000000000000+0
         9 2.938119377115880-1 9.558632461069740-1 0.000000000000000+0
        10 1.449194890231618-1 9.894434504817674-1 0.000000000000000+0
        11 2.18241585825745-16 1.000000000000000+0 0.000000000000000+0
        12 1.090000000000000+0 0.000000000000000+0 0.000000000000000+0
        13 1.084510927125266+0 1.644918453121334-1 0.000000000000000+0
        14 1.055554855713800+0 3.346644660942546-1 0.000000000000000+0
        15 1.001024805998978+0 5.045632331609336-1 0.000000000000000+0
        16 9.205406158528394-1 6.672928710563322-1 0.000000000000000+0
        17 8.157933208433636-1 8.157933208433636-1 0.000000000000000+0
        18 6.672928710563322-1 9.205406158528392-1 0.000000000000000+0
        19 5.045632331609336-1 1.001024805998978+0 0.000000000000000+0
        20 3.346644660942547-1 1.055554855713800+0 0.000000000000000+0
        21 1.644918453121337-1 1.084510927125266+0 0.000000000000000+0
        22 2.38263630459991-16 1.090000000000000+0 0.000000000000000+0
        23 1.360000000000000+0 0.000000000000000+0 0.000000000000000+0
        24 1.369079850267447+0 2.230784887064253-1 0.000000000000000+0
        25 1.353397582474839+0 4.567171493297264-1 0.000000000000000+0
        26 1.310237337466211+0 6.933911694047396-1 0.000000000000000+0
        27 1.238603116154034+0 9.241649010673230-1 0.000000000000000+0
        28 1.139630472961694+0 1.139630472961694+0 0.000000000000000+0
        29 9.241649010673232-1 1.238603116154034+0 0.000000000000000+0
        30 6.933911694047396-1 1.310237337466211+0 0.000000000000000+0
        31 4.567171493297264-1 1.353397582474839+0 0.000000000000000+0
        32 2.230784887064256-1 1.369079850267447+0 0.000000000000000+0
        33 2.98329764362728-16 1.360000000000000+0 0.000000000000000+0
        34 1.810000000000000+0 0.000000000000000+0 0.000000000000000+0
        35 1.841260224163052+0 3.202903095818325-1 0.000000000000000+0
        36 1.845732994462190+0 6.584708021329012-1 0.000000000000000+0
        37 1.819880532730269+0 1.004616824864984+0 0.000000000000000+0
        38 1.761870476949361+0 1.346763444054014+0 0.000000000000000+0
        39 1.672063491925692+0 1.672063491925692+0 0.000000000000000+0
        40 1.346763444054014+0 1.761870476949361+0 0.000000000000000+0

define              node                set                 apply1_nodes
          11          22          33          44          55          66          77          88          99         110         121
define              node                set                 apply2_nodes
           1          12          23          34          45          56          67          78          89         100         111
define              edgemt              set                 apply3_edges
              96:0                to             100:0



回复

使用道具 举报

1498

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1168 元
贡献
796 点

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

发表于 2020-3-16 18:01:58 | 显示全部楼层
对 marc 不了解。
你得先确定,你要读取的这些数据,是多少个?
个数是确定的,不变的。还是需要从输出文件的前面获得,比如
sizing                                 0       100       121         0
alloc                       25
elements                     3

他们是否和后面的数据的个数有关系?

16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-16 18:11:58 | 显示全部楼层
fcode 发表于 2020-3-16 18:01
对 marc 不了解。
你得先确定,你要读取的这些数据,是多少个?
个数是确定的,不变的。还是需要从输出文件 ...

从“sizing”可以获得该模型有100个单元,121个节点。后面的内容,因为限制字数我就删掉了些。所以就是从文件中读取这121个节点的坐标,输出来放到另外一个文件中。我想把他们先读到数组中,再输出到另一个文件的坐标的位置会方便点。

1498

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1168 元
贡献
796 点

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

发表于 2020-3-16 22:10:08 | 显示全部楼层
所以,你并没有回答我“如何确定points,coordinates和coonectivity的大小”

16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-16 22:51:20 | 显示全部楼层
fcode 发表于 2020-3-16 22:10
所以,你并没有回答我“如何确定points,coordinates和coonectivity的大小”

不好意思,可能是我的表述有问题。
从“sizing”中看出100个单元和121个节点可以。connectivity就是有100X6(100行,6列)。coordinates就是121个节点的坐标,121X4(121行,4列)。假如sizing这样写:0    4     9     0connectivity就是有4X6(4行,6列)。coordinates就是9个节点的坐标,9X4(9行,4列)。图中的connectity和coordianates紧挨着的下面一行是不需要读取的,就是跳过这一行开始读取数据,
connectity和coordianates都是根据sizing中来变的。然后我现在想把connectity和coordianates输出到另外一个文件中,用什么方法?不用读points了。感谢回答。我真的很高兴。

16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-16 22:55:19 | 显示全部楼层

model1_job1.dat

4.85 KB, 下载次数: 1

1498

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1168 元
贡献
796 点

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

发表于 2020-3-17 09:33:29 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn  implicit none
  Character(len=512) :: cStr
  integer :: k , nUnit = 0 , nNode = 0
  Character(len=*) , parameter :: C_SIZING = 'sizing' , &
                                  C_POINTS = 'points' , &
                                  C_CONNECTIVITY = 'connectivity' , &
                                  C_COORDINATES  = 'coordinates'
  integer , allocatable :: connectivity(:,:)
  real    , allocatable :: coordinates(:,:)
  Open(12,File="model1_job1.dat")
  Do
    read(12,'(a512)',ioStat=k) cStr
    if(k/=0) exit
    cStr = adjustl(cStr)
    if( cStr(:len(C_SIZING)) == C_SIZING ) then
      read(cStr,*) cStr , k , nUnit , nNode
    else if( cStr(:len(C_POINTS)) == C_POINTS ) then
      !//此处可读取points
    else if( cStr(:len(C_CONNECTIVITY)) == C_CONNECTIVITY ) then
      read(12,'(a512)',ioStat=k) cStr
      if(k/=0) exit
      if( nUnit <= 0 ) cycle
      Allocate( connectivity(6,nUnit) )
      read(12,*) connectivity
    else if( cStr(:len(C_COORDINATES)) == C_COORDINATES ) then
      read(12,'(a512)',ioStat=k) cStr
      if(k/=0) exit
      if( nNode <= 0 ) cycle
      Allocate( coordinates(4,nNode) )
      read(12,*) coordinates
    end if
  End Do
  Close(12)
  Open(12,File="out.txt")
  Do k = 1 , size(connectivity,2)
    write(12,*) connectivity(:,k)
  End Do
  Do k = 1 , size(coordinates,2)
    write(12,*) coordinates(:,k)
  End Do
  Close(12)
End Program www_fcode_cn

16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-17 13:30:03 | 显示全部楼层
谢谢你的程序,新手刚学,还要时间理解代码的意思。我现在需要把marc这个有限元文件的格式做修改,大致改三个地方,就是从文件1(model1_job1)里面的sizing读出单元数,节点数,然后写成文件二的control parameter的格式。从文件1(model1_job1)读出connectivity和coordinates,然后写成文件2的connectivity和coordinates格式。这个程序,相当于一个接口,把文件1的格式变成文件2的格式。之前您教我写的程序是把它们读出来,单独放到了一个文件里。现在不仅需要读出来,还要放到输出文件的指定位置。我很愚笨,这个问题该怎么写?不胜感激。


16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-17 13:33:25 | 显示全部楼层




16

帖子

3

主题

0

精华

入门

F 币
70 元
贡献
45 点
 楼主| 发表于 2020-3-17 13:36:22 | 显示全部楼层
这是文件2的格式;
version 1.2(不用修改)
Solution type(不用修改)
       1      
Solution CPU cores(不用修改)
       8      
CONTROL PARAMETER
      13                                                     模型节点数 (要读取来修改)
       4,        8,       16,        2,        1         1.模型单元数(要读取来修改);2.最大边数;3.最大内边数(内节点数);4.材料类型总数;5.边界条件总数。(2,3,4,5项我也不知道怎么修改,就不改了。)
OPTION(不用修改)
       1,        0,        0,        3,        0         
MATERIALS(不用修改)
       1                                                          模型厚度
       1,        0,                                             1.材料编号;2.材料种类(0:表示复合材料;1:表示均匀材料)                                 
   72000,     0.33,   700000,    14500          基体材料参数:弹性模量EO,泊松比VO,屈服应力YEILD_STRESS,切向弹性模量ET      
  430000,     0.25,    1e+08,    50000          夹杂材料参数:弹性模量EO,泊松比VO,屈服应力YEILD_STRESS,切向弹性模量ET      
     9.7                                                         界面临界法向应力      
OUTPUT PARAMETER (不用修改)      
       1,        0,        0,        0,        0         
CONNECTIVITY       (要读取来修改)
       1,        4,        1,        2,        5,        4,        0,        0,        0,        0,        1,        1      
       2,        5,        4,        5,       13,        8,        7,        0,        0,        0,       -1,        2      
       3,        5,        2,        3,        6,       10,        5,        0,        0,        0,       -1,        1      
       4,        8,        5,       10,        6,       11,        9,       12,        8,       13,       -1,        2      
COORDINATES      (要读取来修改)
       1,       -1, (x)       1  (y)  
       2,       -1,        0      
       3,       -1,       -1      
       4,        0,        1      
       5,        0,        0      
       6,        0,       -1      
       7,        1,        1      
       8,        1,        0      
       9,        1,       -1      
      10,        0,     -0.5      
      11,      0.5,       -1      
      12,        1,     -0.5      
      13,      0.5,        0      


2.txt

2.16 KB, 下载次数: 0

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-4-4 23:17

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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