主题:[讨论]请教文件读取问题:如何用read语句跳行直接读取?
andyfem [专家分:0] 发布于 2008-05-05 16:43:00
对于数据量大的文件,例如只要读取100001行以后的数据,100001行以前的数据需要跳过,我目前的做法是:
do i=1,100000
read(100,*) !100为数据文件
enddo
对于批量处理,这种方法读取速度较慢。
如果能用read语句跳行,直接从100001行开始读数,那应该快许多。请问各位高手,这种想法能实现吗?
十分感谢!
最后更新于:2008-05-05 17:08:00
回复列表 (共16个回复)
11 楼
liangrong [专家分:2090] 发布于 2008-05-09 12:46:00
補充:
用編譯器ftn95試了一下
他的recl須定為 recl = 64
也許是不包含0dx,0ax這兩個字元
可以試試看是否可行
12 楼
andyfem [专家分:0] 发布于 2008-05-09 14:58:00
再次感谢liangrong兄。
调试的时候把recl=64,还是出现相同错误。因此猜测是编译器的原因。
13 楼
accordion [专家分:830] 发布于 2008-05-10 22:21:00
不同编译器对RECL=M中的解释是不同的,有的是解释为长度M,有的是解释为长度M*4
14 楼
necrohan [专家分:1440] 发布于 2008-05-13 21:58:00
我用CVF6.6试了,3楼方法正确,我按3楼设置 RECL=66,因为要算行末的换行+回车。
如果楼主有问题,那可能是因为没有设置字节长度为1
Project->Settings->Fortran下
下拉菜单选择 Fortran Data
在 Data Options 中勾选 Use Bytes as RECL= unit for Unformatted Files
不过我把这个取消重新编译也没有出现楼主的错误,数据仍能正确读出。
可能是数据中每行的格式不一样才出现这个错误,楼主可以在读入后立即输出检查
read (100,600,rec=j)k,disp_part(j,1),disp_part(j,2),disp_part(j,3);
write(*,*)k,disp_part(j,1),disp_part(j,2),disp_part(j,3);
如果一个也没有读入那就是格式有问题,如果读到一部分出错,那就是数据文件有问题。
15 楼
shuangbolover [专家分:20] 发布于 2008-05-15 10:18:00
如果我换成想把第10000行后面的值改成其他的数据,输出形式也和原形式一样,那又要如何使用write语句?请老师赐教,谢谢
16 楼
andyfem [专家分:0] 发布于 2008-05-22 09:36:00
14楼的兄弟真是高人呀,您这招这灵,十分感谢!
我来回复