| 
今天1群有朋友问了这么个问题:
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  现有一个数据文件,文件的列数固定,但是不知道会在哪一行出现空行,默认情况下,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、如果正常情况下站号之前就存在空格,那么将会不读取任何数据
 有没有朋友有更好的算法呢?
 
 
 
 |