0

我有一个文本文件,我想在其中替换我的温度值。此数字在文本中的位置是随机的,如下所示:

'xdd "D:\Data\Ioana\DH1_Short_slow\DH1_360_2.xye" xye_format local !Temperature 360

...(更多文字)

prm    bnonh360  1.66237`_0.41541
prm bh360 = 1.2 * bnonh360;
site Na1 x ref_flag -0.11868`_0.00258 y ref_flag  0.51229`_0.00446 z ref_flag  0.00330`_0.00107 occ Na 1 beq = bnonh360;

...(更多文字)

Out_CIF_STR_Uiso("D:\Data\Ioana\DH1_Short_slow\DH1_360.cif")
Out_Profile("D:\Data\Ioana\DH1_Short_slow\DH1_360_plot.pro")
Out_Tick("D:\Data\Ioana\DH1_Short_slow\DH1_360_plot.tic") '

更多文本意味着文件中的更多文本。例如,我想用 365 替换 360。

我尝试过类似的东西

   do
     read(10,'(a)',iostat=iok) line1
     found = ( (index(line1,'360') /=0) )
     if (found) then
       write(*,*) '365'
      endif 
     if(line1 == '$') exit
     write(*,*) line1
     write(40,*,iostat=iok) line1
  enddo

但这只是在找到 360 的下一行中写入 365。

谢谢

4

1 回答 1

-1

您正在丢弃指数内在返回值中的有价值信息。将'360'替换为'365',它们的长度相同,你可以这样做

pos=index(line1,'360')
if(pos>0)   line1(pos:pos+2)='365'

或者一般来说,如果您想在字符串行中用 s2 替换第一次出现的子字符串 s1,s1 和 s2 可能具有不同的长度,并且它们被填充了您不想包含在替换中的不确定数量的空格, 你做

pos=index(line,trim(s1))
if(pos>0)  line=line(1:pos-1)//trim(s2)//line(pos+len_trim(s1):len_trim(line))

如果您想在替换中包含填充空间,您可以更改 RHS 子字符串中的位置偏移量。如果要对所有事件执行替换,可以将其包含在 while 循环中

这当然是在声明的 line 长度足以容纳新字符串的假设下。但是,请注意FORTRAN77 中禁止自赋值,因此如果您使用的是自赋值,则需要不同的字符串变量来存储结果。

于 2013-11-25T16:56:24.513 回答