18229702011 发表于 2020-3-19 00:27:03

读取文件中一个字符串出现的次数

program find_close
implicit none
integer::i=0,k
character(len=512) ::cStr
character,parameter::C_define='define'


   Open(12,File="model1_job1.dat")
Do
    read(12,'(a512)',ioStat=k) cStr            
    if(k/=0) exit
    cStr = adjustl(cStr)
    if(cStr(:len(C_define))==C_define)then   
      i=i+1
   endif
end do
write(*,*)i
close(12)
end program

在文件中“define”明明只出现了3次,但为什么我的代码最后i是4次
但如果我把含define那部分单独复制出来放在另外一个文件中(如图),再用这个程序读取就是3次,这是为什么?

kyra 发表于 2020-3-19 09:04:54

本帖最后由 kyra 于 2020-3-19 09:06 编辑

character,parameter::C_define='define'
改为
character(len=*),parameter::C_define='define'

如果不改的话,C_define 没有定义长度,则长度为1。
所以,虽然赋值为 'define',但实际的值是 'd'
那么程序的作用就变成了:“搜索d开头的行”


而文件中的 dist loads 也满足了要求。
所以 i 就是 4,而不是 3

18229702011 发表于 2020-3-19 11:55:24

其实我想知道 在这个语句描述中if(cStr(:len(C_define))==C_define)then。
cStr(:len(C_define)这个表示的意思,它是指什么?是指从1开始到“C_define”这个字符串长度结束?这个冒号“:”前没写数字,是指从默认1开始?还是从“某一个位置”开始?谢谢你的回复。

18229702011 发表于 2020-3-19 11:57:32

噢!是这样啊,我照着这别人教我的程序来写,都能写错。还有一个问题,我还想知道,
在这个语句描述中if(cStr(:len(C_define))==C_define)then。
cStr(:len(C_define)这个表示的意思,它是指什么?是指从1开始到“C_define”这个字符串长度结束?这个冒号“:”前没写数字,是指从默认1开始?还是从“某一个位置”开始?谢谢你的回复。

楚香饭 发表于 2020-3-19 12:00:50

指从1开始到“C_define”这个字符串长度那么长结束
冒号前面没写数字,默认就是1

18229702011 发表于 2020-3-19 12:17:28

好的,谢谢。继续学习。外加天天逛帖子:-lol
页: [1]
查看完整版本: 读取文件中一个字符串出现的次数