Fortran Coder

查看: 63|回复: 2

[文件读写] 关于do while下iostat的问题

[复制链接]

37

帖子

9

主题

0

精华

专家

F 币
308 元
贡献
168 点

规矩勋章

发表于 2020-6-17 15:52:32 | 显示全部楼层 |阅读模式
首先,这个问题我已经通过修改代码解决了。但还是没有搞懂为什么是这样,故来问一下。
问题描述:从do while 开始,我循环读取了两个文本,使用status1、status2来查询文件读取状态。接着是在do循环下,使用了两个并列的if语句。程序执行完,结果只有第二个if语句判断后的结果。当我把两个文件中任何一个文件的读取给注释掉,执行结果都正确。
最后我的解决办法是,写两个do while。第一个do while下,读取并判断第一个文件;第二个do while 读取判断第二个文件。结果经过我对比检查是正确的。
so,我还是不知道第一种方法为什么错,请求赐教!谢谢!!
[Fortran] 纯文本查看 复制代码
program flash_density_test
implicit none

!声明变量
character(len=512)::cRead,dRead
character(len=10)::datee
character(len=15)::time
real::lat,lon
character(len=4)::timingerror
integer::station
integer::status1=0,status2=0
integer::i,j
integer,parameter::nx=150,ny=140
real,dimension(nx,ny)::md
character(len=10)::year,month,day,hour,minn,sec,ti,station1,ex1,ex2,ex3
real::lat1,lon1

do i=1,nx
    do j=1,ny
        md(i,j)=0.0
    end do
end do

!读取文件
open(11,file='2006.txt',status='old')
OPEN(12,file='output1.txt',status='replace')
OPEN(13,file='xinan.grd',form='unformatted',status='replace')
OPEN(14,file='20170210_27.txt',status='old')

do while(.true.)
    read(11,"(A512)",iostat=status1)cRead
    if(status1/=0) exit
    CALL parserRead(cRead)
    !write(*,*)lat,lon
    lon=lon-97
    lat=lat-21

    READ(14,"(A512)",iostat=status2)dRead
    if(status2/=0) exit
    CALL parserRead1(dRead)
    !write(*,*)lat1,lon1
    lon1=lon1-97
    lat1=lat1-21
    
    do i=1,nx
        do j=1,ny
            if(lon>=(i-1)*0.1.and.lon<i*0.1.AND.lat>=(j-1)*0.1.AND.lat<j*0.1) then
                md(i,j)=md(i,j)+1.0
            end if
            if(lon1>=(i-1)*0.1.and.lon1<i*0.1.AND.lat1>=(j-1)*0.1.AND.lat1<j*0.1) then
                md(i,j)=md(i,j)+1.0
            end if
        end do
    end do
end do

close(11)
write(12,'(1x,150f7.1)')((md(i,j),i=1,nx),j=1,ny)
CLOSE(12)
write(13)((md(i,j),i=1,nx),j=1,ny)
CLOSE(13)
CLOSE(14)

contains
    !调用子程序1
    subroutine parserRead(c)
        character(len=*)::c
        integer::k
        
        do k=1,LEN_TRIM(c)
            if (c(k:k)=="/") c(k:k)="|"
        end do
        READ(c,*)datee,time,lat,lon,timingerror,station
        do k=1,LEN_TRIM(datee)
            if (datee(k:k)=="|") datee(k:k)="/"
        end do
    end subroutine parserRead
    !调用子程序2
    subroutine parserRead1(d)
        character(len=*)::d
        integer::h
        
        do h=1,LEN_TRIM(d)
            if(d(h:h)=="/") d(h:h)="|"
        end do
        READ(d,*)year,month,day,hour,minn,sec,lat1,lon1,ti,station1,ex1,ex2,ex3
        do h=1,LEN_TRIM(year)
            if(year(h:h)=="|") year(h:h)="/"
        end do
    end subroutine parserRead1

end program 
回复

使用道具 举报

531

帖子

1

主题

0

精华

大宗师

F 币
2639 元
贡献
1684 点
发表于 2020-6-18 09:36:12 | 显示全部楼层
很大可能是两个文件的行数不同,常见于末尾多了空行。

37

帖子

9

主题

0

精华

专家

F 币
308 元
贡献
168 点

规矩勋章

 楼主| 发表于 2020-6-18 22:09:32 | 显示全部楼层
li913 发表于 2020-6-18 09:36
很大可能是两个文件的行数不同,常见于末尾多了空行。

点醒我!!第二个文件行数比第一行少太多了,差几个数量级。写的时候没考虑到这个问题。感谢!!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-7-8 19:40

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表