回 帖 发 新 帖 刷新版面

主题:如何操作可以顺利读取一个文件中所需的数据?请指点,谢谢

大家好!有个数据文件的格式如下:

model, based on dimensionless form, b.c.           !
CSBT, fixed time step; Voss discretization            [color=008000]!首行及第二行都为字符串[/color]
    T    F    F    F                [color=008000]!第3行[/color]
    51    51    43  2601111843       [color=008000] !第4行为x,y,z方向的节点数及模型的总节点数[/color]
     0    0     0    0     0      0     0      0      0      0    0    0    [color=008000]!第5行为边界条件的数值[/color]
      0     0    0   0    0     0     0    0     0      0      0     0
        ……  …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… 
        …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… ……  [color=008000]!以上都为边界条件数值,与第5行相同列[/color]
       0   0    0    0    0                              [color=008000]!这行仍为边界条件数值,列数不固定,取决与边界条件的节点个数[/color]    
Initial Conditions;  Time     0.00     (s)                        [color=008000]!这行初始条件提示的字符[/color]
                Temperatures                 [color=008000]!这行为初始条件温度提示字符 [/color]           
2.8E+06  2.89E+06  2.8E+06  2.89E+06 2.89E+06  2.89E+06  2.89E+06  2.89E+06  2.89E+06    [color=008000]!这行为初始条件值[/color]
……  …… …… …… …… …… …… …… …… …… …… …… …… …… 
……  …… …… …… …… …… …… …… …… …… …… …… …… ……             [color=008000]!以上都为初始条件值[/color]
Time Step No.     5 Time  4.32000E+05 (s)                              [color=008000]!这行第5个时间步长的提示字符[/color]
                                     Temperatures             [color=008000] !这行为第5个时间步长温度提示字符[/color]   
2.8E+06  2.89E+06  2.8E+06  2.89E+06 2.89E+06  2.89E+06  2.89E+06  2.89E+06  2.89E+06      [color=008000]!这行开始是所需的数据[/color]
2.8E+06  2.89E+06  2.8E+06  2.89E+06 2.89E+06  2.89E+06  2.89E+06  2.89E+06  2.89E+06 
……  …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… ………
……  …… …… …… …… …… …… …… …… …… …… …… …… …… …… …… ………[color=008000]!以上都为第5个时间步长的温度数值,[/color]

我看了彭国伦的《Fortran 95程序设计》和谭浩强的《Fortran语言程序设计》,上面好像都没有提到如何读取这种文件。
请问一下,读取这种文件应该怎么办?请指导一下,谢谢!
我原先是想用某函数查找字符“Time Step No.”,如果找到,就开始读取数据,可是我翻了以上两本fortran书,似乎都没有提到这种函数。
请问一下,应该怎么做能顺利读取所需的数据?谢谢!

回复列表 (共17个回复)

沙发

fortran里似乎不如C一样有内建的字符串对比函数。对于你这个文件,或许下面的代码能有所帮助:
 
character*200 :: cline
character*20 :: ctemp
...
open(11,file="filename",status="OLD")
do while(.not.eof(11))
  real(11,"(a200)") cline
  read(cline,*) ctemp
  if (trim(ctemp)=="Time") then   ! 找到对应的字符串行
    read(11,*)
    do n=1,max_number
      read(11,*) some_array  ! 读入所需要的数据
    enddo
  endif
enddo

板凳


麻烦请把数据文件上传!

3 楼

jstzhurj老师,我已经将数据文件的一部分上传了,麻烦您看一下,谢谢!

4 楼


要读的有多少行知道吗?

5 楼


要读的行数和列数都是已知还是未知?![em18]

6 楼

这个数据是HST3D软件生成的数据,我想做数据的后处理,使得数据比较规则排列,这样可以导入tecplot生成图像。如果一定要知道数据的行数和列数的话,那么是可以推出来的。
如果行数和列数是未知的话,应该怎么办呢?

7 楼

[quote]这个数据是HST3D软件生成的数据,我想做数据的后处理,使得数据比较规则排列,这样可以导入tecplot生成图像。如果一定要知道数据的行数和列数的话,那么是可以推出来的。
如果行数和列数是未知的话,应该怎么办呢?

[/quote]

文件不全,有些东西就不知道了,我要知道你的数据在中间还是末尾?开始点知道了,结束点有标志么?有行数列数已知最好了!

8 楼

原文件有70多M,压缩后为2M多。

我所需的数据在文件中间的一部分,这个数据文件是按照应力期的顺序排列的。

刚才上传的附件里,假设从“Time Step No.     5 Time  4.32000E+05 (s)”这行开始,之后的数据行数和列数都是已知的话,那么应该怎么做才能忽略前面的数据,直接从“Time Step No.     5 Time  4.32000E+05 (s)”开始读取?

9 楼

您稍等下,我重新生成数据文件,这次数据文件会小点。

10 楼

我重新上传了附件,里面有文件格式说明。

我来回复

您尚未登录,请登录后再回复。点此登录或注册