Fortran Coder

标题: IVF上fortran中利用read将字符串的数据赋给变量,出现NAN [打印本页]

作者: 律1234    时间: 2021-11-7 19:30
标题: IVF上fortran中利用read将字符串的数据赋给变量,出现NAN

在Visual Fortran上,利用fortran中的read将字符串中的数据赋值给各个对应的变量,结果出现NAN,而且还是中间的数据出现NAN

string_line = '## 2145 172800.00000000 900.00000000 59261 0.000000000 ‘
read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d

循环的时候,结果有时正常,有时b却为NAN

这种情况可能是由什么原因引起的啊?希望各位大神能指点一二



作者: 唐汉    时间: 2021-11-8 07:53
我猜你是有一个文件要读取,然后你把每一行读成字符串然后再把字符串读成变量?
或者是有很多文件,然后要从每个文件里读一些header?(因为这很像是bash或者gnuplot的header)。

(a)如果是
你可以去检查一下你需要读取的文件,是否每一行的格式都是固定的?
如果有的时候第二个数字多一位少一位,后面的数据就会读不出来。我记得论坛里面之前有提到过,读这种文本格式的数据用类似
[Fortran] 纯文本查看 复制代码
read(file_unit, *) var1

这种格式会方便一些。

(b)如果不是
那你可能要稍微提供多一点的信息。
作者: 律1234    时间: 2021-11-8 09:17
唐汉 发表于 2021-11-8 07:53
我猜你是有一个文件要读取,然后你把每一行读成字符串然后再把字符串读成变量?
或者是有很多文件,然后要 ...

确实是在读文件,我也试过你说的这种方式读取,但还是一样NAN,而且我发现将read这句再写一次,也就是连续读两次这个字符串,
string_line = '## 2145 172800.00000000 900.00000000 59261 0.000000000 ‘
read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
居然第一次是NAN,第二次是正确的,这就离谱了(用*也一样)。

作者: 唐汉    时间: 2021-11-9 07:29
你可能要提供一个minimal bug report,我这边写了一个非常短的代码去尝试复现你的问题
[Fortran] 纯文本查看 复制代码
program main

    implicit none
    character(len=:), allocatable :: string_line
    integer :: a, c
    real :: b, d

    string_line = '## 2145 172800.00000000 900.00000000 59261 0.000000000 '
    read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
    print *, a, b, c, d
    read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
    print *, a, b, c, d

end program main

这段代码我在gfortran上面编译和运行是没有问题的。
作者: fcode    时间: 2021-11-9 08:44
read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
改为
character(len=1) :: x
read (string_line, *) x , a , x , b, c, d

在实际工作中,95%以上的情况下,read 用 * (表控格式)就足够了。
另外 3% 的情况下,不能直接用表控格式,但可以间接用表控格式代替。
剩下 2% 的情况,不得不用格式符read

事实上,格式符基本是为了 write 准备的。


作者: 律1234    时间: 2021-11-9 13:34
唐汉 发表于 2021-11-9 07:29
你可能要提供一个minimal bug report,我这边写了一个非常短的代码去尝试复现你的问题
[mw_shl_code=fortra ...

我也试过将这个字符串单独写出来,也都是正常的,主要是搁在我的一个大的整体程序下,就会出现以上问题,现在虽然将那一句运行两次整个程序能够运行,但第一次运行总是NAN,第二次就是正确的
作者: 律1234    时间: 2021-11-9 13:37
fcode 发表于 2021-11-9 08:44
read (string_line, '(3x,i4,17x,f14.8,1x,i5,1x,f15.13)') a, b, c, d
改为
character(len=1) :: x

试过了,没用,四个数据,就第二个数据会出问题;整个大程序中还有另外一个地方也是读文件,出现同样的问题,而且也是第二个数据出问题,前后的数据都是正常的
作者: fcode    时间: 2021-11-9 14:11
不能提供能复现问题的最小程序,那就爱莫能助了。
作者: fcode    时间: 2021-11-9 14:12
律1234 发表于 2021-11-9 13:37
试过了,没用,四个数据,就第二个数据会出问题;整个大程序中还有另外一个地方也是读文件,出现同样的问 ...

我说的关于表控格式的建议,并不是希望解决你的问题。
而是告诉你,能用表控的话,不但代码书写简单,并且对数据格式的容许度最大。
(而不是多一个空格,少一个空格,结果就出错)
作者: 唐汉    时间: 2021-11-10 02:34
律1234 发表于 2021-11-9 13:34
我也试过将这个字符串单独写出来,也都是正常的,主要是搁在我的一个大的整体程序下,就会出现以上问题, ...

如果单独把这个字符串写出来是正常的,但是放进大程序里面就不行,那说明问题不出在这儿。这就是为什么楼上让你把最小的能复现bug的程序提供出来的原因(也就是我说的minimal bug report),这样我们才能判断这是否是编译器的问题。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2