相关文章推荐
淡定的创口贴  ·  Swift ...·  1 年前    · 
坏坏的西装  ·  ‘RegAsm.exe‘ ...·  1 年前    · 

Fortran从文件读取日期和时间
2015-10-27 17:47:41   来源:竹叶知风飘@fcode   评论: 0 点击:

文件中常常包含日期时间等信息。初学者处理这类文件时,常遇到如何读取日期和时间这个难题,因为fortran并不提供日期、时间的类型。本文介绍了一些读取时间日期的思路,推荐新手阅读。

某些文件中常常包含日期和时间等有用信息,比如记录某天的降雨量,某一个地震的发震时刻等。初学者处理这类文件时,常会遇到如何读取日期和时间这个难题,因为fortran并不提供日期、时间类型。常见的日期时间表示方式有以下几种:
1、2015-01-01 08:30:02
2、2015-1-1 08:30:02
3、2015.01.12 08:30:02
4、2015.1.12 08:30:02
5、2015/10/02 08:30:02
6、2015/10/2 08:30:02

即:年、月、日之间可用横杠、点号或斜杠分隔,其中年占4位,月日各占2位(1,3,5)或占1-2位(2,4,6)。一般来说,在同一个文件中,分隔符是相同的,即不会出现同时使用横杠和斜杠的情形,这里只讨论以横杠分隔的情形。
当年、月、日、时、分、秒所占位数固定时(1,3,5),由于数据规整,可直接使用相应输入格式来读取。下面给出例子1:
输入文件:
日期      时间      震级
2015-01-01 08:30:02    2.0
2015-04-12 13:33:45    2.4
2015-10-09 10:05:23    4.3
2015-12-31 06:11:14    2.1

program test implicit none integer(4) YY, MM, DD, h, m, s, i real d character(80) cLine open(11,file='1.txt',action='read') read(11,*) !(i4,1x,i2,1x,i2,1x,i2,1x,i2,1x,i2,4x,f3.1) read(11,'(i4,5(1x,i2),4x,f3.1)',iostat=i) YY, MM, DD, h, m, s, d if(i/=0) exit write(*,'(6i5,2x,f3.1)') YY, MM, DD, h, m, s, d end do end program test 当月、日所占位数不固定时,上面的代码就不适用了,此时需要先将每一行内容读取到字符串,通过处理字符窜来获得有用信息。我们先看例子2:
日期      时间      震级
2015-1-1 08:30:02    2.0
2015/4/12 13:33:45    2.4
2015-10-9 10:05:23    4.3
2015-12-31 06:11:14    2.1

program test implicit none integer(4) YY, MM, DD, h, m, s, i, j real d character(80) cLine open(11,file='1.txt',action='read') read(11,*) read(11,'(a)',iostat=i) cLine if(i/=0) exit do j = 1, len_trim(cLine) if(index('/-:',cLine(j:j))>0) cLine(j:j)=' ' end do read(cLine,*) YY, MM, DD, h, m, s, d write(*,'(6i5,2x,f3.1)') YY, MM, DD, h, m, s, d end do end program test 例2的编程思想是:
1、将整行信息读入字符串
2、将字符串中的横杠、斜杠和冒号替换为空格
3、使用内部文件读写,从字符窜读取信息。
总结:这里给出了两个读取日期和时间的例子,推荐使用例2的思想,因为例1仅针对数据规整的情况,而例2可处理不规整的数据,更具通用性。
例2中没有给出分隔符为点号的情形,是因为数据中同时存在小数点,也会被替换。这种情形稍微复杂,我们给出编程思路,读者可自行实现。
1、将整行信息读入字符串
2、使用内部文件读写,从字符窜读取震级数据
3、将字符串中的横杠、斜杠、点号和冒号替换为空格
4、使用内部文件读写,从字符窜读取日期和时间。
  • · 高斯勒让德求积分Fortran程序 (10)
  • · 《Intel Visual Fortran应用程序开... (10)
  • · FAQ之 Intel Fortran + VS 基本操作 (10)
  • · 任意表达式求值模块 (9)
  • · Intel Fortran编译器 (9)
  • · 差分进化算法 (8)
  • · 新语法系列 之 定义变量和数组的那点事 (8)
  • · 教你看懂 Intel Fortran 的运行时错误 (8)
  • · 《使用OpenMP 进行 Fortran95并行计算》 (8)
  • · 《Fortran95 程序设计》【彭国伦】 (8)
  • · 快速傅里叶变换FFT (8)
  • · Fortran 95/2003科学计算与工程 (8)
  • · FAQ之 Intel Fortran + VS 安装配置 (7)
  • · FAQ之 文件行列与二维数组行列 (7)
  • · VS2010下配置MPI开发环境 (7)
  •