回 帖 发 新 帖 刷新版面

主题:[讨论]请教文件读取问题:如何用read语句跳行直接读取?

对于数据量大的文件,例如只要读取100001行以后的数据,100001行以前的数据需要跳过,我目前的做法是:
  do i=1,100000
     read(100,*)    !100为数据文件
  enddo

 对于批量处理,这种方法读取速度较慢。
 如果能用read语句跳行,直接从100001行开始读数,那应该快许多。请问各位高手,这种想法能实现吗?
  十分感谢!

回复列表 (共16个回复)

沙发


open(unit,finlename,access="direct")
read(unit,format,rec=100001)

板凳

十分感谢1楼的兄弟!
您推荐的方法还没琢磨成功。
迫切希望您再次出手,针对以下例子给予改写。该例子中,数据文件stress.dat有500万行,只需要读取100000后的25000行数据
  open(100,file="D:\stress.dat",status="old")   
   do j=1,100000   !跳过前面100000行
     read (100,*) 
   enddo
   do j=1,25000     
     read (100,600) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
   enddo !j
  close(100)
  600  format(i6,e22.6,e18.6,e18.6)   
  


3 楼

open(100,file="D:\stress.dat",action="read",access="direct",form="formatted",recl=66,status="old")   
   do j=100001,125000     
     read (100,600,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
   enddo 
  close(100)
  600  format(i6,e22.6,e18.6,e18.6)

4 楼

[quote]open(100,file="D:\stress.dat",action="read",access="direct",form="formatted",recl=66,status="old")   
   do j=100001,125000     
     read (100,600,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
   enddo 
  close(100)
  600  format(i6,e22.6,e18.6,e18.6)
[/quote]

十分感谢korina 兄!
本想给此帖评30分,可是系统提示“同一主题评分不能超过50分”,所以只能20分啦。
还得请您出手:按照您提供的方法改写程序,运行之后出现以下错误提示:
“forrtl: severe (64): input conversion error, unit 100, file D:\stress.dat”

5 楼

剩下的工作我就不知道了  看看你的数据文件读取的格式跟你的原文件格式是不是一致的  此外 我不是兄弟

6 楼

你试试把格式说明去掉!
open(100,file="D:\stress.dat",action="read",access="direct",recl=66,status="old")   
   do j=100001,125000     
     read (100,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
   enddo 
  close(100)

7 楼

[quote]你试试把格式说明去掉!
open(100,file="D:\stress.dat",action="read",access="direct",recl=66,status="old")   
   do j=100001,125000     
     read (100,rec=j) k,disp_part(j,1),disp_part(j,2),disp_part(j,3)
   enddo 
  close(100)
[/quote]

十分感谢楼上兄弟!
我也试过这种方法,去掉form="formatted" 之后出现以下错误:
forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 100

8 楼

3F korina 的程序是可行的
因為是有format的讀取方式
所以如 korina 所說
需要比對文件格式與程序中讀取的格式是否一致
如果能列出一個數據
也許較方便瞭解問題所在

9 楼

谢谢liangrong老师!
部分数据如下,请各位老师继续不吝赐教。另外,我用的编译器是CVF6.6,不知是否与编译器有关。
 11851          -.140551E-01      -.622954E-01      -.446735E-01
 11852          -.140128E-01      -.623127E-01      -.446332E-01
 11853          -.139680E-01      -.623208E-01      -.446324E-01
 11854          -.139673E-01      -.623137E-01      -.446762E-01
 11855          -.140148E-01      -.623086E-01      -.446766E-01
 11856          -.140567E-01      -.622955E-01      -.446590E-01
 11857          -.140584E-01      -.622954E-01      -.446325E-01
 11858          -.140617E-01      -.623163E-01      -.446947E-01
 11859          -.140492E-01      -.623290E-01      -.446912E-01
 11860          -.140615E-01      -.623161E-01      -.446858E-01

10 楼

我用gfortran編譯
你的數據可以讀寫無誤
不確定是不是編譯器的關係
但以前曾有遇過編譯器自家對recl的聲明相異的情形
編譯器的文件或許有說明

我来回复

您尚未登录,请登录后再回复。点此登录或注册