Fortran Coder

查看: 9251|回复: 2
打印 上一主题 下一主题

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

[复制链接]

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

跳转到指定楼层
楼主
发表于 2020-6-17 15:52:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先,这个问题我已经通过修改代码解决了。但还是没有搞懂为什么是这样,故来问一下。
问题描述:从do while 开始,我循环读取了两个文本,使用status1、status2来查询文件读取状态。接着是在do循环下,使用了两个并列的if语句。程序执行完,结果只有第二个if语句判断后的结果。当我把两个文件中任何一个文件的读取给注释掉,执行结果都正确。
最后我的解决办法是,写两个do while。第一个do while下,读取并判断第一个文件;第二个do while 读取判断第二个文件。结果经过我对比检查是正确的。
so,我还是不知道第一种方法为什么错,请求赐教!谢谢!!
[Fortran] 纯文本查看 复制代码
01program flash_density_test
02implicit none
03 
04!声明变量
05character(len=512)::cRead,dRead
06character(len=10)::datee
07character(len=15)::time
08real::lat,lon
09character(len=4)::timingerror
10integer::station
11integer::status1=0,status2=0
12integer::i,j
13integer,parameter::nx=150,ny=140
14real,dimension(nx,ny)::md
15character(len=10)::year,month,day,hour,minn,sec,ti,station1,ex1,ex2,ex3
16real::lat1,lon1
17 
18do i=1,nx
19    do j=1,ny
20        md(i,j)=0.0
21    end do
22end do
23 
24!读取文件
25open(11,file='2006.txt',status='old')
26OPEN(12,file='output1.txt',status='replace')
27OPEN(13,file='xinan.grd',form='unformatted',status='replace')
28OPEN(14,file='20170210_27.txt',status='old')
29 
30do while(.true.)
31    read(11,"(A512)",iostat=status1)cRead
32    if(status1/=0) exit
33    CALL parserRead(cRead)
34    !write(*,*)lat,lon
35    lon=lon-97
36    lat=lat-21
37 
38    READ(14,"(A512)",iostat=status2)dRead
39    if(status2/=0) exit
40    CALL parserRead1(dRead)
41    !write(*,*)lat1,lon1
42    lon1=lon1-97
43    lat1=lat1-21
44     
45    do i=1,nx
46        do j=1,ny
47            if(lon>=(i-1)*0.1.and.lon<i*0.1.AND.lat>=(j-1)*0.1.AND.lat<j*0.1) then
48                md(i,j)=md(i,j)+1.0
49            end if
50            if(lon1>=(i-1)*0.1.and.lon1<i*0.1.AND.lat1>=(j-1)*0.1.AND.lat1<j*0.1) then
51                md(i,j)=md(i,j)+1.0
52            end if
53        end do
54    end do
55end do
56 
57close(11)
58write(12,'(1x,150f7.1)')((md(i,j),i=1,nx),j=1,ny)
59CLOSE(12)
60write(13)((md(i,j),i=1,nx),j=1,ny)
61CLOSE(13)
62CLOSE(14)
63 
64contains
65    !调用子程序1
66    subroutine parserRead(c)
67        character(len=*)::c
68        integer::k
69         
70        do k=1,LEN_TRIM(c)
71            if (c(k:k)=="/") c(k:k)="|"
72        end do
73        READ(c,*)datee,time,lat,lon,timingerror,station
74        do k=1,LEN_TRIM(datee)
75            if (datee(k:k)=="|") datee(k:k)="/"
76        end do
77    end subroutine parserRead
78    !调用子程序2
79    subroutine parserRead1(d)
80        character(len=*)::d
81        integer::h
82         
83        do h=1,LEN_TRIM(d)
84            if(d(h:h)=="/") d(h:h)="|"
85        end do
86        READ(d,*)year,month,day,hour,minn,sec,lat1,lon1,ti,station1,ex1,ex2,ex3
87        do h=1,LEN_TRIM(year)
88            if(year(h:h)=="|") year(h:h)="/"
89        end do
90    end subroutine parserRead1
91 
92end program
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

838

帖子

2

主题

0

精华

大宗师

F 币
3937 元
贡献
2339 点
沙发
发表于 2020-6-18 09:36:12 | 只看该作者
很大可能是两个文件的行数不同,常见于末尾多了空行。

37

帖子

9

主题

0

精华

专家

F 币
336 元
贡献
182 点

规矩勋章

板凳
 楼主| 发表于 2020-6-18 22:09:32 | 只看该作者
li913 发表于 2020-6-18 09:36
很大可能是两个文件的行数不同,常见于末尾多了空行。

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-30 10:20

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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