[转载]利用fortran编程读取文件中任意长度的一行文字

标签:
转载 |
分类: MATLAB |
matlab中一个简单命令fgets或fgetl,就可以获得光标所在行的字符串,fortran能否也实现此matlab函数功能?在下绞尽脑汁想了一个比较笨的办法。
fortran中按照字符串格式如果读取文件中内容,必须读取时字符串的长度,但是我们在不知道一行内容时候,无法给出确切的答案。所以这就只能将一行内容先"数"一遍,然后再按照特定长度进行读取。
1、数某一行内容字符串的长度,可以用如下命令
character(1) :: string
do
enddo
其中,string是长度为1的字符;advance='no',可以让某一行存入缓冲区后,read语句结束时并不将缓冲区内容清除掉。即是说,这个do循环是始终在读文件中特定一行内容,读到结尾处时,按照eor=102的命令,跳转到102标号的指令处,可以跳出循环继续执行。
2、用特定长度字符串读取文件某一行
确定某行内容长度的指令可以在主程序中,也可以另外写子例程。但是读取时候需要定义任意长度字符串,而fortran又不支持数完个数后,再定义字符串的写法。所以,这个内容必须写在另外一个子例程中。
subroutine readWholeLine(n,fileUnit)
! 确定文件一行内容总长度后,用字符串格式读取
integer :: n,fileUnit
character(len = n)string
backspace fileUnit
read(fileUnit,'(a)')string
write(*,*)string
endsubroutine readWholeLine
首先用backspace返回上一行;然后通过传递字符串长度方法,定义固定长度字符串string;然后按照(a)字符格式读取即可。
3、测试
文件某一行内容为133长度的字符串
the world is fantasy jdisoafjdoisa jfjdisaof fdjisoalfdjsa jfidsaojfdsa djisaofdlsa djisaofjdsalfdjs fdjisaofjdslafdjsakfj j jfdsa
程序运行:
http://s9/middle/7a1c18a84df2cbe4d1078&690
4、鸣谢
计算某一行内容字符串的长度方法参考自云卷云舒的网易博客http://blog.163.com/jey_df/blog/static/182550161201211411555954
(话说这设置权限一点用都没有,还是能用google搜索到,所以我觉得设置所谓"禁止转载"也没什么意义,反正又不关吃饭这种大问题,大家随便拿去用好了。)
其他内容都是参考自《fortran95/2003程序设计》这本书,写的很基础,内容也很全,但是应用实例不多。每次解决问题时候,这本书就像提供了一大盒积木,而如何把积木摆放,用哪块积木,就看自己的本事了。