加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-07-16 20:56:32)
标签:

转载

分类: MATLAB

matlab中一个简单命令fgets或fgetl,就可以获得光标所在行的字符串,fortran能否也实现此matlab函数功能?在下绞尽脑汁想了一个比较笨的办法。

 

fortran中按照字符串格式如果读取文件中内容,必须读取时字符串的长度,但是我们在不知道一行内容时候,无法给出确切的答案。所以这就只能将一行内容先"数"一遍,然后再按照特定长度进行读取。

1、数某一行内容字符串的长度,可以用如下命令

character(1) :: string

do

    read(fileUnit,'(a)',advance='no',eor=102)string

    contour = contour+1

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/1825501612012114115559542/

(话说这设置权限一点用都没有,还是能用google搜索到,所以我觉得设置所谓"禁止转载"也没什么意义,反正又不关吃饭这种大问题,大家随便拿去用好了。)

其他内容都是参考自《fortran95/2003程序设计》这本书,写的很基础,内容也很全,但是应用实例不多。每次解决问题时候,这本书就像提供了一大盒积木,而如何把积木摆放,用哪块积木,就看自己的本事了。

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有