作者st3336 (Strance)
看板Fortran
标题[心得] 字串比较的相等问题
时间Fri Jan 31 17:00:51 2020
这篇文的分享,其实是为了让我以後再遇到,可以来爬文XD
事情的发生,是我为了比较两个"我认为应该要一样的字串",但怎麽样都判定不相等
是这样的,我有一份资料档案文件,它的结构是这样:
event.dat ----------------------------------------
Event 1
Element1 data1 data2 data3
.
.
.
ElementN data1 data2 data3
.
.
.
Event N
Element1 data1 data2 data3
.
.
.
ElementN data1 data2 data3
--------------------------------------------------
而其有一个对照表,是我另外做的,像是对答案一样的工作,
对照表的格式如下:
teble.dat ---------------------------------------
Element1 attribute1 attribute2 attribute3
Element2 attribute1 attribute2 attribute3
.
.
.
ElementN attribute1 attribute2 attribute3
--------------------------------------------------
我同时要读取档案的 ElementN ,并寻找对照档案中 ElementN的attribute
於是我使用正常方式来分别读取,如以下形式:
open(11,file="event.dat",status="old")
open(12,file="tabel.dat",status="old")
read(11,'(a5)')ele1
do while (.ture.)
read(12,'(a5)')ele2
if (trim(ele1) .eq. trim(ele2)) then
! ...资料处理程序...
exit
end if
end do
这里问题就发生了,在搜寻的过程中,ele1与ele2从来没有相等的时候,
我便输出几个数值来看:
write(*,*)trim(ele1),trim(ele2),(trim(ele1).eq.trim(ele2))
结果为:
ABC AAA F
ABC ABB F
ABC ABC F
这个问题让我纳闷很久(大概一天XD),为什麽明明看起来一样,却说不一样。
後来看长度才发现 len(ele1)=5 len(ele2)=3,难怪判断都是false。
问题在於trim没有删除开头为空格的功能,只能删除字串尾的空格。
这里Element的名称有规定,是最多5个字元,最小3个。
而两个档案在读取的时候,对齐的方向不太一样,一个靠左一个靠右。
造成取得的字串可能分别为: " ABC"、"ABC "。
trim的结果分别为:" ABC"、"ABC",因此造成怎麽样都无法相等。
因此我把原本的code加入去除开头空格的功能
read(11,'(a5)')ele1
if (scan(trim(ele1)," ",back=.true.) == 1) then
read(ele1,'(1x,a4)')ele11
else if (scan(trim(ele1)," ",back=.true.) == 2) then
read(ele1,'(2x,a3)')ele11
else
read(ele1,'(a5)')ele11
end if
这才真正解决我的问题,顺利使资料跟参考档案的内容能对得起来。
至於为什麽会有前端空格的问题,是因为我再制作参考档案的时候,
使用awk的格式化输出,也利於fortran固定格式的读取:
awk '{printf "%5s %7.4f %8.4f %6.1f\n",$1,$2,$3,$4}' tabel0.dat > tabel.dat
因此会强制补满五格,但是会补在前面= =
以上是我这次的心得,如果有更好的建议希望可以指导我一下XD
--
[05/31/2012 23:59:11] 与 XXXXX 交谈:
st3336: ?
XXXXX: 你好不好意思
XXXXX: 你好,不好意思打绕ˇ
st3336: ..
st3336: 我以为我被呛了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.115.20.47 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Fortran/M.1580461256.A.104.html
※ 编辑: st3336 (140.115.20.47 台湾), 01/31/2020 17:02:09
1F:→ gilocustom: Fortran90以降有adjustl或adjustr,再搭配trim。 01/31 17:58
2F:推 fragmentwing: 推 02/02 03:09
3F:推 jubilee2: trim(adjustl(ele1)) 这样就好 02/04 02:51
4F:→ st3336: 真的欸 这样就行了 以後都通用这种好了 02/04 11:33