回 帖 发 新 帖 刷新版面

主题:read语句里的end真的有效么?

顾名思义,read(10,*,end=100)是指当10号文件读完的时候跳转到100行代码出继续执行文件,但是我在使用过程中发现这个效果根本没就没体现出来,例如我的10号文件只有一行数据:abcde,代码为:

                                                                     read(10,*,end=100)con

                                                                     write(*,*)con

                                                                     100 stop

                                                                     end

理论上来说read读完了con之后就自动跳到100 stop才是,不应该执行write这一步,但是为何实际中还是执行了?请高人赐教

回复列表 (共6个回复)

沙发

有效的。
只是你的代码文件还没有读到末尾,末尾是下一行,也就是第二行。换个意思,就是说如果read里加上iostat=error,当error不等于0,文件到了末尾,读取不成功时候,才转到end语句行。我再加了一句read,程序没有运行write部分。如下

Program abc
implicit none
integer  con

open(unit=10,file= "abc.txt" )
read(10,*,end=100)con
read(10,*,end=100)con
write(*,*)con
100 stop

end program abc

板凳

有趣的是我写了另外一个,如果换成下面的,假设是abc是空文件,由于加了一个write语句,把数字10写入文件,此时读取的位置正好在第一行行末,这时再用read语句,就直接到了文件末尾,不会运行第二个write语句:   

open(unit=10,file='abc.txt')
write(10,*) 10
read(10,*,end=100) con
write(*,*) con
100 stop

论坛的回复真是差劲啊,编辑不了格式,换行统统没有用。。。

3 楼


受教良多啊,这么一个小小的问题困扰了我许久,多谢了heizaoniangao 兄

4 楼

顺便问一下,第二个例子中read之所以能直接跳到文件末尾,其本质是read和write是一致的,计算机对他俩的认定就如同第一个例子中的双read一般,不知道我这个认识合不合理。。?

5 楼

应该这么理解:

因为是顺序读取,无论是write或者read,运行完了之后读取位置会停留在这一行的行末,然后等待向下一行输入或者读入。第一个例子里的第一个read和第二个例子里的第一个write运行完了之后,文件读取的位置就到了第一行的行末,而第二行是没有的,所以再用read是读取不了了,程序认为到了文件末尾,所以转到endlist那一行。

所以两个read和一个write加一个read最后效果是一样的,因为第一个read和第一个write把读取位置都移到了第一行的行末。

6 楼

[quote]
受教良多啊,这么一个小小的问题困扰了我许久,多谢了heizaoniangao 兄[/quote]

不客气,对你有帮助就好,而且你这个问题挺有意思的。

我来回复

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