Fortran Coder

查看: 55|回复: 9

[文件读写] txt文本有一个类似换行符的东西,导致报错Fortran runtime erro

[复制链接]

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

发表于 2020-5-21 22:14:49 | 显示全部楼层 |阅读模式
导致报错:Fortran runtime error: End of file
数据展示如图
Fortran报错如图
代码:
[Fortran] 纯文本查看 复制代码
program wwlln_2009_text
implicit none

    character(len=512)::cRead
    character(len=20)::filename,DYfilename
    character(len=20)::wwlln_date,wwlln_time
    real::lat,lon
    character(len=5)::timingerror
    character(len=2)::station
    integer::status1=0
    integer,parameter::fileid1=12,fileid2=13
    integer::i
    logical alive

    OPEN(14,file="A20090101.txt",status="old",form="formatted")
    OPEN(15,file="20090101.txt",status="replace")

    do while(.true.)
        READ(14,"(A512)",iostat=status1)cRead
        if(status1/=0) exit
        CALL parserRead(cRead)
        write(*,*)wwlln_date,wwlln_time,lat,lon,timingerror,station
        if((lat>21).AND.(lat<34).AND.(lon>97).AND.(lon<111)) then
            write(*,*)wwlln_date,wwlln_time,lat,lon,timingerror,station
            write(15,*)wwlln_date,wwlln_time,lat,lon,timingerror,station
        end if
    end do
    CLOSE(14)
    close(15)

contains
    !调用子程序
    subroutine parserRead(c)
        character(len=*)::c
        integer::j
        
        do j=1,LEN_TRIM(c)
            if (c(j:j)=="/") c(j:j)="|"
        end do
        READ(c,*)wwlln_date,wwlln_time,lat,lon,timingerror,station
        do j=1,LEN_TRIM(wwlln_date)
            if (wwlln_date(j:j)=="|") wwlln_date(j:j)="/"
        end do
    end subroutine parserRead

end

请问大家,这种情况该怎么让程序继续下去!


Fortran报错

Fortran报错

数据展示

数据展示
回复

使用道具 举报

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-21 22:15:35 | 显示全部楼层
救救孩子,谢谢各路大神

1517

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1297 元
贡献
869 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-5-22 08:15:50 | 显示全部楼层
没有数据文件,看不出问题,也不能重现。

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 08:25:15 | 显示全部楼层
fcode 发表于 2020-5-22 08:15
没有数据文件,看不出问题,也不能重现。

我传一个数据文件上来,重新建个帖子

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 08:29:28 | 显示全部楼层
链接:https://pan.baidu.com/s/1hlCBrQ2TBab_a-bgDcIMow
提取码:wsmp
文件太大,没法上传。传至百度云了。在线等!谢谢谢谢!!!

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 08:30:47 | 显示全部楼层
fcode 发表于 2020-5-22 08:15
没有数据文件,看不出问题,也不能重现。

链接:https://pan.baidu.com/s/1hlCBrQ2TBab_a-bgDcIMow
提取码:wsmp
文件太大,没法上传。传至百度云了。在线等!谢谢谢谢!!!

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 08:49:58 | 显示全部楼层
我对这个数据的的理解是,每一个年份和前面一个数字之间是有一个换行符的。而图片中展示的地方,不仅有换行符,还有一个空。这个地方原本应该是有一条数据,可能是某种原因导致这条数据缺失,没有记录下来,但是依旧给他分配了一个存放数据的位置。所以程序每次读到这里,就结束了,但是实际的循环次数远不止这么点,然后报错。是这样吗

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 09:42:43 | 显示全部楼层
fcode 发表于 2020-5-22 08:15
没有数据文件,看不出问题,也不能重现。

我在read(14,"(A512)",iostat=status1)cRead 后面加了一个
if(cRead=="")then
   cycle
end if
跳过那个空行,现在不报错了!
感谢你的帮助!

107

帖子

2

主题

0

精华

大师

F 币
656 元
贡献
338 点

规矩勋章

发表于 2020-5-22 11:12:39 | 显示全部楼层
Zhuming 发表于 2020-5-22 09:42
我在read(14,"(A512)",iostat=status1)cRead 后面加了一个
if(cRead=="")then
   cycle

你那个文件就是多了一个空行,而且后面还有,跳过去的方法很好。
用Ultraedit看这种文件吧,每行都能分开。

30

帖子

6

主题

0

精华

熟手

F 币
229 元
贡献
122 点

规矩勋章

 楼主| 发表于 2020-5-22 15:09:04 | 显示全部楼层
necrohan 发表于 2020-5-22 11:12
你那个文件就是多了一个空行,而且后面还有,跳过去的方法很好。
用Ultraedit看这种文件吧,每行都能分开 ...

好的!谢谢!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2020-6-5 08:51

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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