登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
今天1群有朋友问了这么个问题:
现有一个数据文件,文件的列数固定,但是不知道会在哪一行出现空行,默认情况下,fortran读取到空行(该朋友的文件中空行中是有空格的)会自动跳过直到读取到数据为止,这样的话如果使用的是固定循环数量的话,就会出现实际循环数小于指定循环数的情况,最终就是 -end of file encountered
这个是他的示例数据:
53694 1960 1 1 -24 79 -89
53694 1960 1 2 15 97 -56
53694 1960 1 3 0 79 -41
53694 1960 1 4 40 101 -29
53694 1960 1 5 -13 15 -44
53694 1960 1 6 -41 37 -107
0 0 0 0 0 1 2
他的要求是:空出的行跳过去,该行的数组赋值为0,如果用fortran默认的方法读取,也就是下面这个他给我的程序:
program yy12
integer i,titol,station,year(8),month(8),day(8)
&,htmin(8),htmax(8),a(8)
open(222,FILE='test.txt',FORM='FORMATTED')
do i=1,8
read(222,*) station,year(i),month(i),day(i),htmin(i),htmax(i),a(i)
print*
print*,i
print*,station,year(i),month(i),day(i),htmin(i),htmax(i),a(i)
enddo
700 format(i5,3x,i5,x,i4,4x,i2,3x,i2,3x,i5)
close(222)
end
结果将会是这样:
原因就是上面说的fortran默认读取的问题,因此要解决就需要先判断该行是否为空行,我的方法也不是很完美,只是根据第一列进行了判断,程序如下:
program yy12
integer i,titol,year(8),month(8),day(8)
&,htmin(8),htmax(8),a(8)
character*5 station
open(222,FILE='test.txt')
i=1
do while(1)
read(222,'(a)',end=100,advance='no')station
if(trim(station)=="")then
read(222,*)
year(i)=0
month(i)=0
day(i)=0
htmin(i)=0
htmax(i)=0
a(i)=0
i=i+1
cycle
endif
read(222,*)year(i),month(i),day(i),htmin(i),htmax(i),a(i)
!print*,station,year(i),month(i),day(i),htmin(i),htmax(i),a(i)
i=i+1
enddo
100 close(222)
end
我把整型的站号修改为字符型,然后来判断是不是为空,这样算是解决了他的数据格式问题,但是还有很多毛病:
1、如果空行什么数据都没有,只有一个回车,那么将会认为文件到空行就结束了;
2、如果正常情况下站号之前就存在空格,那么将会不读取任何数据
有没有朋友有更好的算法呢?
|