搜档网
当前位置:搜档网 › Fortran中批量处理文件的方法总结

Fortran中批量处理文件的方法总结

Fortran中批量处理文件的方法总结
Fortran中批量处理文件的方法总结

Fortran中批量处理文件的方法总结

—循环读取目录下的所有符合条件的文件

一、简单的介绍

在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。

对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!

这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。

我总结的批处理方法大概可以用下面这个示意图来说明:

|

|

|将文件目录写入一个文本文件,供fortran循环读取

|————手动输入文件名

|————运行程序之前命令行工具导出文件名

|————程序运行后,未开始计算之前,生成文件名

| ————调用CMD命令生成

| ————GETFILEINFOQQ方法生成

| ————调用WIN32API生成

|

|在程序运行时动态生成文件名

|

|

对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。

二、方法的介绍

1、将文件目录写入一个文本文件,供fortran循环读取

1.1、手动输入文件名

这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。

1.2、运行程序之前命令行工具导出文件名

这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。

a、从运行工具打开你的CMD窗口;

b、转到要处理的当前目录(可省略):CD /d 路径,如:

CD /d e:\test

这样可以快速到达e:\test目录

c、使用DIR命令列出文件目录信息到指定的文件,通常使用的

Dir *.*>新文件名这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,现在要使用的命令是:

DIR /b filter>newfile

注意,其中的filter为文件筛选,必须自己修改为所需的,比如你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。

Newfile就是你需要存放文件名的那个文件,比如可以是 dir.txt,这样就成了 dir /b*.txt>dir.txt,就会把当前目录下的所有文件都列出到dir.txt文件中,当然,由于dir.txt也在当前目录,所以也会被算进去,这在处理的时候是需要注意的,下面几种方法中同样考虑了这个问题。你可以选择手动删掉,或者把dir.txt这个文件存到其他地方去,或者,不要和你需要的文件具有相同的后缀也行,比如:dir /b *.txt>e:\dir.txt (假设当前目录是e:\test)

如果省略了第二步中的转到当前目录的话,就需要在dir命令后输入完整的路径了,而且新生成的文件也要选择有权限建立新文件的地方存放,比如你在c:\users目录下输入:dir /b e:\test\*.txt>e:\dir.txt,这个命令和上面先转到e:\test目录下的效果是一样的。

现在你是不是比较好奇,/b 是干嘛的,其实就是只列出文件名,不要其他的附件信息,比如创建时间,文件大小等等这些对于我们批处理无关的信息。

如果你想包含某个目录下的子目录,那么,就可以这样写:

Dir /b/s filter>newfile

/s就表示包含子目录,但是,这样会有一个问题,那就是,批处理的时候必须获得正确的路径才能操作,这样得到的子目录里面的文件不会有任何标志说

他是来自子目录的,因此fortran处理的时候就无法判断了,所以,如果包含了子目录,那么请用下面的命令:

Dir /a-d/b/s filter>newfile

现在去看看新生成的文件吧,怎么样,很惊喜吧!

懂了这个方法,下面一部分的第一个方法对你来说就是小菜一碟啦。

如果你使用的win7(或vista)系统,而且无法正常使用CVF编译器的话,那么第一部分到这里就算结束啦,除非,你会在其他fortran编译器中调用WIN32API。

1.3、程序运行后,未开始计算之前生成文件名

1.3.1、在程序中调用CMD命令

这个方法其实就是上一个方法的进化版,只不过变成了在程序运行的时候调用命令自动生成,这样整个过程显得少一点,只需要在程序里设置好相关的参数即可。

这个方法的关键在于SYSTEMQQ函数的使用,这是CVF编译器封装的调用CMD命令的一个函数,存在于DFLIB库中,其语法命令为:

result = SYSTEMQQ(commandline)

commandline:表示需要进行的CMD操作,字符串形式,函数中的实际长度由传入的参数决定,input类型(表示输入为参数);

Results:一个逻辑型变量(logical(4)),如果成功为true,失败为false (不解的是程序中要实现的东西都是正常的,比如仅仅传入dir命令,返回的结果仍然为F,请高手赐教)

给出一个简单的例子:

USE DFLIB

LOGICAL(4)result

result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt')

这个命令将第一个路径中的文件复制到为第二个路径中的文件。通过这个例子再结合上面一个方法,就可以很方法便的构造出我们需要用来批处理的子函数,关键语句如下所示:

subroutine ListToFile(fPath,outPut)

character*(*),InTent(In):: fPath,outPut

character*100CMD

LOGICAL(4) res

CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut)

res=SYSTEMQQ(CMD)

endsubroutine

其中传入的是文件筛选值和输出的路径,这个方法也是我在第一部分中最为推荐的一个方法了,代码简洁高效,能够输出完整的路径,可以包含子文件夹,唯一的缺点就是输出的文件个数不能直接在程序中调用(方便循环),需要在批处理的时候使用其他方法来判断文件是否读取结束。

NEW:

{

如果你使用的是WIN7系统,那么请使用上面提示下载的msf4.0版的fortran,只要把上面的子程序替换为下面所示的即可:

subroutine ListToFile(fPath,outPut)

character*(*),InTent(In):: fPath,outPut

character*100 CMD

CMD="dir /a-d/b/s "//trim(fPath)//" >"//trim(outPut)

call SYSTEM(CMD)

endsubroutine

}

1.3.2、使用GETFILEINFOQQ方法生成文件目录该方法是下面一个方法的进化版,是由CVF对WIN32的API进行了封装,这样,我们就可以通过简单的调用函数来实现一些面向对象的功能。简单的翻译了一下官方给出的GETFILEINFOQQ函数信息:Module: USE DFLIB (存在于DFLIB库中)语法简介:Syntax result = GETFILEINFOQQ (files, buffer, handle) files :输入类型的字符型变量,表示你需要查找的路径(也就是我们上面方法中的筛选值),同样可以使用*或者?这样的通配符。buffer :在函数运行中会获得一个值,可供输出使用,这个值就是所找到的文件的相关信息,属于FILE$INFO类型的变量(该

类型定义于:fortran安装路径DF98\INCLUDE路径下),其结构如下:TYPE FILE$INFO INTEGER(4)CREATION INTEGER(4)LASTWRITE INTEGER(4)LAS TACCESS INTEGER(4)LENGTH INTEGER(4)PERMIT CHARACTER(255)NAME END TYPE FILE$INFOhandle :接受输入和输出整型变量,表示文件控制信息(同样在DFLIB中定义),包含以下内容:FILE$FIRST - First matching file found. FILE$LAST - Previous file was the last valid file. FILE$ERROR - No matching file found. Results: 返回值是一个整型变量(integer(4)),表示的不含空格的文件名长度,如果文件未找到,则返回0。了解了以上信息,我们就可以通过编程进行循环调用这个函数,每找到一个符合条件的文件,就把他输入到指定路径的文件中去,注意,凡是input类型的变量都必须传入数值,否则会出错。如果你比较有探索精神,就试着用这个介绍和思路来编程一下吧,子程序如下所示(完整的请下载附件)Subroutine

GetFileList(cFileName,outPut,iFile) UseDFLib,only:GetFileInfoQQ,GetLas tErrorQQ,FILE$INFO,FILE$LAST,FILE$ERROR,FILE$FIRST,ERR$NOMEM,ERR$NOENT,FILE$DIR !引入库函数Implicit None!根据上面的语法介绍来定义变量

Character*(*),Intent(In)::cFileName !筛选值character*(*),intent(In)::output !输出路径Integer,Intent(InOut)::iFile !记录已经找到几个文件TYPE (FILE$INFO) info !找到的文件的信息INTEGER(4)::Wildhandle,length !文件控制信息,文件大小,Wildhandle = FILE$FIRSTiFile = 0 DOWHILE (.TRUE.) !循环找文件 length = GetFileInfoQQ(cFileName,info,Wildhandle) !调用函数找文件!如果遇到错误或者不能再找到不同的文件,则进入选择,准备退出 IF ((Wildhandle .EQ.

FILE$LAST) .OR.(Wildhandle .EQ. FILE$ERROR)) THEN SELECT CASE (GetLastErrorQQ()) CASE (ERR$NOMEM) !//内存不

足 iFile = - 1 Return CASE (ERR$NOENT) !//碰到通配符序列尾,正常退出 Return CASE DEFAULT iFile =

0 Return END SELECT END IF iFile= iFile +

1 Call WriteFileName( Trim(https://www.sodocs.net/doc/3f9342564.html,) ,outPut, iFile) !调用子函数输出文件名 ENDDO End Subroutine GetFileList

注意,在调用子函数输出文件名时,要做一些处理,主要是判断文件是否存在(不存在则新建,如果是第一次找到,而且文件存在,则覆盖,否则追加),以及找到的是否为我们自己建立的这个dir.txt文件(如果是,则忽略,找到的文件数量-1)这个方法也不错,如果不需要子目录的信息,其优越性不亚于上一种方法,因为该子函数能够直接返回找到的文件数量。

1.3.3调用WIN32API生成目录下的文件信息有了上面的几种方法,其实这个方法可以不需要介绍,但是也许有和我一样喜欢刨根问底的朋友,还是贴出来,也算是分享一下CVF平台下对于API的调用方法。fortran的最大强项是数值计算,他本身对于各种系统信息的处理功能实在不敢说好,如果要实现一些交互的功能目前来说还是比较复杂的。

该方法直接调用系统的API函数来实现功能,理论上只要是fortran编译器支持API调用,就可以使用该方法,也就是说可以用于win7和vista(linux

的不在本次讨论范围,上面的几种方法思路在linux均需要变换才能使用)。目前我还没有测试在MPF4.0等其他的编译器中使用API函数的情况,感兴趣的测试后不要忘了来分享啊^v^。

该方法主要使用了一下三个系统函数:FindFirstFile,FindNextFile和

FindClose,这三个函数存在于系统的Kernel32.dll函数中,因此调用之前需要先引用这个函数库。简单给出这三个函数的介绍:HRESULT

FindFirstFile( [in,string] LPCWSTR wsSearchFile [out] LPWIN32_FIND_DATAW pFindFileData [out] LP HANDLE pSearchHandle );wsSearchFile:字符串类型的变量,也就是上面说的筛选值, pFindFileData,表示所找到的文件的信息,类似上面方法中的那个FILE$INFO类型,也是在函数调用过程中生成信息,他的类型就是WIN32_FIND_DATA(一个结构体,在fortran中使用TYPE定义)。pSearchHandle:这是一个表示文件地址的变量,类似于我们用OPEN命令打开一个文件时,前面给一个unit的意思,他可以用在后面的FindNextFile和FindClose函数中。该函数的返回值为0表示文件未找到。HRESULT FindNextFile( [in] HANDLE hSearchHandle [out] LPWIN32_FIND_DATAW pFindFileData );该函数可以用上面所获得HANDLE句柄来查找下一个符合条件的文件,函数运行过程中同样给pFindFileData生成了相关信息,文件名就从其中获取。返回值同FindFirstFile。HRESULT

FindClose( [in] HANDLE hSearchHandle ); 根据上

面的文件句柄关闭文件,返回值同上。有了对这三个函数的了解,接下来的事情就是如何使用这三个函数了,给出关键的子程序并作说明:subroutine FindName(FileExt,outFile,iFile) Usekernel32 !载入函数库

integer,parameter::maxlen=80 ! 设置一个文件名长度的阈值

CHARACTER*(*) FileExt,OutFile !筛选值和目标路径

Integer(4) hFind,res !文件句柄和返回值integer(4),intent(inout)::iFile !已找到的文件个数(不含dir.txt)Type(t_WIN32_FIND_DATA) FindFileData !系统定义的一个结构体信息,具体的可以自行查阅WIN32API手册character*maxlen cname ! 这个变量用来存放获得的文件名,长度为上面所设定的,不宜太长res=1iFile=0 hFind = FindFirstFile(FileExt,FindFileData) !找第一个文件 If(hFind ==

INVALID_HANDLE_VALUE)then Return ! 没有找到匹配文件,返回结果

=-1 else !继续循环寻找下一个 do

while(res) iFile=iFile+1 !先把已有的写入文

件 cname=FindFileData.cFileName !这一段代码很特殊,主要是因为调用API之后,默认的文件名长度非常之长,用常用的trim()函数无法缩短,因为文件名后面并不是空格,而是一个值为0的ASCII字符,因此用循环将这个字符替换为空格,以便于后面的处理,这也是上面说阈值不宜过大的愿意,否则浪费时间 do

i=1,maxlen if(ichar(cname(i:i))==0) cname(i:i)='

' enddo callWriteFileName(trim(cname),outFile,i File) !调用子函数写出文件

名 res=FindNextFile(hFind,FindFileData) 继续查找

下一个,用res的值来控制循环是否退

出 enddo res=FindClose(hFind) !退出循环后关闭文件 endifendsubroutine 肿么样,API函数看下来是否有点晕晕的,能看到这里相信你对fortran的理解又加深了一些吧。该方法和上一种方法如出一辙,优缺点也近乎相同,同样没有包含子目录(你有兴趣的话可以试试能否使

用FindFileData里面的信息让这个子程序包含子目录,如果有了结果,同样不要忘了来分享哦)。

总结一下上面的几种方法,手工输入适用于文件比较少,而且路径比较复杂的时候;使用dir命令几乎可以通吃,但是无法直接给出文件数目;PI函数功能较为一般,但是可以直接获得找到的文件个数,而且通过writefile子函数的处理,可以让dir.txt直接存在于当前目录下但不包含在本身的文件列表中。选哪一种,完全看你的需要和喜好啦!

一个小小的例子(使用SYSTEMQQ实现):在当前目录下有 1.txt…4.txt 这样4个文本文件(注意路径以及文件名中不要有空格,否则fortran中就得按字符读取了),分别存放一个数字:1,2,3,4,要求循环读取这些文件中的数字,并且相加,给出最终的和,程序如下:program listfilecharacter*100 fPathcharacter*200 pathcharacter*7 outPutinteger

a,bb=0fPath="*.txt"outPut="dir.txt"call ListToFile(fPath,outPut) !先生成文件列表open(1,file='dir.txt',status='old') !打开生成的列表文

件 10continue !由于不知道有多少行,所以下面使用END标签来控制文件是否结

束 read(1,*,end=20)path if(index(Path,"dir.txt")==0)then !我生成的是绝对路径,所以,用该函数检查读取的这一行是否为文件列表本身,如果不是再往下操

作 open(2,file=''//trim(Path)//'',status='old') read(2,*)a close(2) b=b+a endif goto 1020 close(1) !文件读取结束print*,b !输出和end program listfile

二、运行时动态生成文件名

这个是针对具有特殊需求,或者是文件名有着非常好的规律性才这样做,比如我开始的时候说的调用MIcpasd的文件进行处理,由于需要每天都运行程序,而且每天不同时候都会有新的文件生成,显然,使用第一部分中说的方法是不合理的,工作量太大(当然,如果你愿意写一个批处理定时生成文件名也未尝不可),重要的是Micaps数据文件具有相当好的文件名格式(不是数据格式,嘿嘿),基本是按照年月日时.时效样的格式来生成的,因此,就可以设置某种规则来自动生成需要处理的文件名。

具体的例子就不举例了,也许以后有空会把我那个程序翻出来共享一下,主要的思路就是获取系统时间,根据时间生成这时候应该处理的文件的文件名(年月日时,时效都有,文件名就不愁啦),你可以在这次程序运行结束后,就把下次需要处理的文件名事先生成好(我就是这样做的),然后下次直接处理那些文件就行,如果遇到文件不存在等信息,最好也记录下来。

fortran语法手册

1 FORTRAN77四则运算符 + - * / ** (其中**表示乘方) 在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→() 2 FORTRAN77变量类型 2.1 隐含约定:I-N规则 凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。 如IMPLICIT REAL (I,J) 三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。 2.4 数组的说明与使用 使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例: DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3) REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2) 10FORMAT(1X,5(A2,I2,1X,A2,I4)) 2.5 使用DATA语句给数组赋初值 变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如 DATA A,B,C/-1.0,-1.0,-1.0/ DATA A/-1.0/,B/-1.0/,C/-1.0/ DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10)

DATA CHN/10*' '/INTEGER NUM(1000) DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/ 3 FORTRAN77程序书写规则 程序中的变量名,不分大小写; 变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前6位有效; 一行只能写一个语句; 程序的第一个语句固定为PROGRAM 程序名称字符串 某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内容; 某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内容; 某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句最多可有19个续行; 某行的第7至72字符位为语句区,语句区内可以任加空格以求美观; 某行的第73至80字符位为注释区,80字符位以后不能有内容。 4 FORTRAN77关系运算符 .GT. 大于 .GE. 天于或等于 .LT. 小于 .LE. 小于或等于 .EQ. 等于 .NE. 不等于 .AND. 逻辑与 .OR. 逻辑或 .NOT. 逻辑非 .EQV. 逻辑等 .NEQV. 逻辑不等 运算符优先级由高到低顺序为:()→**→*或/→+或-→.GT.或.GE.或.LT. 或.LE.或.EQ.或.NE.→.NOT.→.AND.→.OR.→.EQV.或.NEQV 5 FORTRAN77语句

ABAQUS中Fortran子程序调用方法

第一种方法: / o/ J5 @6 U/ ^- o$ 1. 建立工作目录/ ]" 2. 将Abaqus安装目录\6.4-pr11\site下的aba_param_dp.inc或aba_param_sp.inc拷贝到工作目录,并改名为aba_param.inc; # ~/ |0 I0 E6 {, @4 X3 q: W3. 将编译的fortran程序拷贝到工作目录; 4. 将.obj文件拷贝到工作目录; 5. 建立好输入文件.inp; 6. 运行abaqusjob=inp_name user=fortran name即可。 第二种方法: 在Job模块里,创建工作,在EditJob对话框中选择General选项卡,在Usersubroutine file中点击Select 按钮,从弹出对话框中选择你要调用的子程序文件(后缀为.for或.f)。 , D8 i7 d/r c6 @" | 以下是网上摘录的资料,供参考:. |$ t/ }$W7 Y6 m4 h6 D6 j 用户进行二次开发时,要在命令行窗口执行下面的命令: 4 O. R+ ^,@( ? abaqus job=job_name user=sub_name ABAQUS会把用户的源程序编译成obj文件,然后临时生成一个静态库standardU.lib和动态库standardU.dll,还有其它一些临时文件,而它的主程序(如standard.exe和explicit.exe等)则没有任何改变,由此看来ABAQUS是通过加载上述2个库文件来实现对用户程序的连接,而一旦运行结束则删除所有的临时文件。这种运行机制与ANSYS、LS-DYNA、marc等都不同。 : j6 g' R-o( {0 [* N2 J3 X这些生成的临时文件要到文件夹C:\Documentsand Settings\Administrator\Local Settings\Temp\中才能找到,这也是6楼所说的藏了一些工作吧,大家不妨试一下。 1子程序格式(程序后缀是.f; .f90; .for;.obj??) 答:我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。在Abaqus中,运行abaqusj=jobname user=username时,默认的用户子程序后缀名是.for(.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。 如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。 2CAE中如何调用?Command下如何调用? 答:CAE中在creat job的jobmanager中的general中可以指定子程序; Command下用命令:abaqus j=jobnameuser=userfilename (无后缀); 3若有多个子程序同时存在,如何处理 答:将其写在一个文件中即可,然后用一个总的子程序调用(具体参见手册) 4我对VF不是很熟,是否可以用VC,C++编写子程序? A: 若要在vf中调试,那么应该根据需要把SITE文件夹中的ABA_PARAM_DP.INC(双精度)或ABA_PARAM_SP.INC(单精度)拷到相应的位置,并改名为ABA_PARAM.INC即可。 据说6.4的将可以,6.3的你可以尝试着将VC,C++程序编译为obj文件,没试过。在你的工作目录下应该已经存在ufield.obj和uvarm.obj这两个文件(这两个文件应该是你分别单独调试ufield.FOR和uvarm.FOR时自动编译生成的,你可以将他们删掉试试看),但是由于你的FOR文件中已经有了UV ARM 和UFIELD这两个subroutine,显然会造成重复定义,请查实。 用户子程序的使用 假设你的输入文件为:a.inp b.for 那么在ABAQUS Command 中的命令应该是这样的: abaqusjob=a user=b

fortran文件读取技巧

最近专业课海洋要素计算作业需要用fortran编程读取验潮站资料(如下,是txt,其中数据是有62行,限于篇幅,我只截取了前5行数据外加验潮站的4行头信息) !要注意的是最后一列数据后面没有空格 program ex1 !********************************************** !* written by 潘海东, 2015,3,20 !*一次性读取744个数据,放入一维数组中 !*(如果一次性读取太多的话可能会对系统造成某些影响) !********************************************** INTEGER :: b(62*12),i character(len=20) time,location,u1,u2 open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old') !********读取头信息 read(10,"(A3)") u1 read(10,"(A18)") time read(10,"(A13)") location read(10,"(A2)") u2 !********读取数据 read(10,100) b(:) 100 format(61(11(I4,1x),I4,/),11(I4,1x),I4) !在fortran的输入输出中'/'代表换行 close(10) end program ex2 !********************************************** !* written by 潘海东, 2015,3,20 !*读取第3列至第11列 !********************************************** INTEGER :: a(62,9),i character(len=20) time,location,u1,u2 open(10, file = 'C:\Users\Administrator\Desktop\sjs_t_97aug_m(harmonic).txt', status = 'old') !***读取头信息

Matlab笔记——数据预处理——剔除异常值及平滑处理

012. 数据预处理(1)——剔除异常值及平滑处理测量数据在其采集与传输过程中,由于环境干扰或人为因素有可能造成个别数据不切合实际或丢失,这种数据称为异常值。为了恢复数据的客观真实性以便将来得到更好的分析结果,有必要先对原始数据(1)剔除异常值; 另外,无论是人工观测的数据还是由数据采集系统获取的数据,都不可避免叠加上“噪声”干扰(反映在曲线图形上就是一些“毛刺和尖峰”)。为了提高数据的质量,必须对数据进行(2)平滑处理(去噪声干扰); (一)剔除异常值。 注:若是有空缺值,或导入Matlab数据显示为“NaN”(非数),需要①忽略整条空缺值数据,或者②填上空缺值。 填空缺值的方法,通常有两种:A. 使用样本平均值填充;B. 使用判定树或贝叶斯分类等方法推导最可能的值填充(略)。 一、基本思想: 规定一个置信水平,确定一个置信限度,凡是超过该限度的误差,就认为它是异常值,从而予以剔除。

二、常用方法:拉依达方法、肖维勒方法、一阶差分法。 注意:这些方法都是假设数据依正态分布为前提的。 1. 拉依达方法(非等置信概率) 如果某测量值与平均值之差大于标准偏差的三倍,则予以剔除。 3x i x x S -> 其中,11 n i i x x n ==∑为样本均值,1 2 211()1n x i i S x x n =?? ??? =--∑为样本的标准偏差。 注:适合大样本数据,建议测量次数≥50次。 代码实例(略)。 2. 肖维勒方法(等置信概率) 在 n 次测量结果中,如果某误差可能出现的次数小于半次时,就予以剔除。 这实质上是规定了置信概率为1-1/2n ,根据这一置信概率,可计算出肖维勒系数,也可从表中查出,当要求不很严格时,还可按下列近似公式计算:

Fortran常用函数

1、RANDOM_NUMBER Syntax ['sint?ks] n. 语法 CALL RANDOM_NUMBER (harvest结果) Intrinsic Subroutine(固有子程序):Returns a pseudorandom number greater than or equal to zero and less than one from the uniform distribution. 返回大于或等于0且小于1,服从均匀分布的随机数 2、RNNOA/ DRNNOA (Single/Double precision) Generate pseudorandom numbers from a standard normal distribution using an acceptance/rejection method. 产生服从标准正态分布的随机数 Usage(用法) CALL RNNOA (NR, R) Arguments(参数) NR— Number of random numbers to generate. (Input) 要产生随机数的个数 R— Vector of length NR containing the random standard normal deviates. (Output) 输出长度为NR,随机正态分布的向量 Comments(注解) The routine RNSET can be used to initialize the seed of the random number generator. The routine RNOPT can be used to select the form of the generator. 程序RNSET可以用来初始化随机数发生器的种子 Example In this example, RNNOA is used to generate five pseudorandom deviates from a standard normal distribution. INTEGER ISEED, NOUT, NR REAL R(5) EXTERNAL RNNOA, RNSET, UMACH C CALL UMACH (2, NOUT) NR = 5 ISEED = 123457 CALL RNSET (ISEED) CALL RNNOA (NR, R) WRITE (NOUT,99999) R 99999 FORMAT (' Standard normal random deviates: ', 5F8.4) END Output Standard normal random deviates: 2.0516 1.0833 0.0826 1.2777 -1.2260

fortran心得

Read 的规则: 按行读取,每次读一行,读完后光标自动跳到下一行的开头,空格和逗号代表结束(所以空格和逗号也是读取的一部分的话,需要使用“输入输出格式”) 如果想要将一行数据读入数组,代码为: Read(10,*) s(:,:,:) 不用规定输入输出格式,因为会根据s(:,:,:)确定需要读入的数字的个数,然后fortran会按部就班的读取,甚至文件中当前这一行的数字个数不足以填满s(:,:,:)的时候,read会自动跳到下一行继续搜索数字,直到填满s(:,:,:)为止。 但是需要注意给数组赋值的顺序:read会把它搜索到的第一个数字给s(1,1,1),第二个给s(2,1,1),第三个给s(3,1,1)… 程序9 1: 将read(unit=field,fmt="(A79)",iostat=status)buffer 中的A79改为A2,结果只输出每行的前两个字符,说明read是按整行整行读取的。 中间空了几行之后,空行之后的内容还是能被读取和输出,这说明,空行和空白是不一样的:空行也算是一种文本内容,因此不会终止读取,而空白意味着结束。 !读取文件 program main implicit none character(len=79)::filename="number.txt",buffer integer,parameter::field=10 integer::status=0 logical alive inquire(file=filename,exist=alive) if(alive)then open(unit=field,file=filename) do while(.true.) read(unit=field,fmt="(A79)",iostat=status)buffer if(status/=0)exit write(*,"(A79)")buffer end do else write(*,*)filename,"does't exist." end if pause stop end program main ============================================= 附number.txt =============================== 1234555666

FORTRAN知识点总结

F O R T R A N 第2章FORTRAN90基础知识: 程序单元的概念: fortran90程序是一种分块形式的程序,整个程序由若干程序单元块组成。每个程序只有一个主程序单元。各单元体的程序体形式上相同。 程序单元可以是主程序、子程序(外部过程或内部过程)、模块MODULE (供其他程序单元引用即把该程序单元内的全部语句复制到程序单元中)或块数据程序单元BLOCK 。 语言元素:指在程序设计中用到的基本成分,如字符集、常量、变量、记号(标号、关键字、名字、常数、运算符和定界符)以及其他的基本结构等。 字符集:英文字母、阿拉伯数字、下划线、21个特殊字符($和?没有规定用法)。 数据结构: 整型INTEGER (34-2下划线后面是种别参数),n 位字长的计算机的数据表示范围一般为12~211-+---n n ,种别参数由内在询问函数KIND 送回,种别值提供的最小范围由内在函数SELECTED-INT-KIND 送回,表示十进制幂的范围由内在函数RANGE 送回; 实型REAL ,小数形式和指数形式;复型COMPLEX (种别类

型参数值取实部与虚部中较大者); 字符型CHARACTER,由一对单撇号或双撇号之间的字符序列组成; 逻辑型LOGICAL。 派生数据类型TYPE; 数组INTEGER,DIMENSION(1,50)::A,可直接对数组元素进行运算如3*A,SQRT(A); 字符子串,在字符串CHARACTER(LEN=80)::ROW中,ROW(1:3)就表示字符串ROW中第1到第3个元素组成的子串。 变量名的命名规则:不能超过31个字符;组成成分是字母、数字、下划线;第一个字符必须是字母。 第3章基本语句: 类型说明语句:类型说明(种别说明),属性说明::变量名表 尽量避免把两个实数作相等或不相等的比较。淘汰隐式说明IMPLICIT NONE 种别说明:种别参数即对可移植数据精度和范围进行选择的机制 KIND(X) 返回变元X的种别参数值 SELECTED-REAL-KIND(n,m) 产生一个种别值,它表示某一精度和范围。N指十进制有效位数,m指明值范围内以10为底的幂次。

fortran中批处理实现

********************************************* fortran中批处理命令的实现函数: 利用systemqq命令(需要调用DFLIB 数据库) ********************************************* 例1: USE DFLIB character*100 CMD LOGICAL(4) res CMD="dir/a-d/b/s "//trim(fPath)//" >"//trim(outPut) res=SYSTEMQQ(CMD) 例2: USE DFLIB LOGICAL(4) result result = SYSTEMQQ('copy e:\dir.txt e:\test\dir.txt') !将e:\dir.txt 复制到e:\test\dir.txt文件中。!****************实例3:复制文件************************* 例3: programmain_pro USE DFLIB implicit none integer,parameter::sta_num=123 character(5),dimension(sta_num)::sta_ID character(500)::filein,fileout character(5000)::cmd logical(4)::judge

integer::status,is open(1,file='山东.txt',status='old',action='read',iostat=status) read(1,*) do is=1,sta_num read(1,*) sta_ID(is) filein='Z:\data\降水逐小时数据-戴至修\precip_data\'//sta_ID(is)//'_precip.txt' open(2,file= filein,status='old',action='read',iostat=status) if(status/=0) goto 1000 fileout='Z:\data\降水逐小时数据-戴至修\山东省-降水数据\'//sta_ID(is)//'_precip.txt' cmd='copy '//filein//' '//fileout judge=SYSTEMQQ( cmd) 1000 continue enddo end program

Fortran进行批处理地方法

Fortran中批量处理文件的方法总结 —循环读取目录下的所有符合条件的文件===================== 一、简单的介绍 在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。 对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦! 这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。 我总结的批处理方法大概可以用下面这个示意图来说明: | | |将文件目录写入一个文本文件,供fortran循环读取 |————手动输入文件名 |————运行程序之前命令行工具导出文件名 |————程序运行后,未开始计算之前,生成文件名 | ————调用CMD命令生成 | ————GETFILEINFOQQ方法生成 | ————调用WIN32API生成 | |在程序运行时动态生成文件名 | | 对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。第二种方法主要是说明其思路。 二、方法的介绍 1、将文件目录写入一个文本文件,供fortran循环读取 1.1、手动输入文件名 这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。

(完整版)Fortran之COMMON语句

Fortran之COMMON语句 FORTRAN程序中各程序单位之间的数据交换可以通过虚实结合来实现,还可以通过建立公用区的方式来完成。公用区有两种,一种是无名公用区,任何一个程序中只可能有一个无名公用区;一种是有名公用区,一个程序中可以根据需要由程序员开辟任意多个有名公用区。建立无名和有名公用区都通过COMMON语句来进行。 按照结构化程序设计的指导思想,通常主张通过虚实结合的途径来传送数据而不主张使用公用区。因为前者使程序有较好的可读性,而且容易跟踪数据的流向,便于对程序进行调试和维护。但是虚实结合的传送方式速度较慢,特别是在各程序单位之间有大量的数据需要传送时速度问题就更为突出。不同程序单位利用公用区交换数据的速度却比虚实结合的方式传送速度快得多。所以在很多应用程序中如果各程序单位之间有大量数据需要传送时,程序员一般仍然采用开辟公用区的方式。 11.2.1 无名公用区 开辟无名公用区COMMON语句的一般形式如下: COMMON a1,a2,… 其中a1,a2,…允许是普通变量名、数组名和数组说明符(注意:不是数组元素),它们之间用逗号隔开。例如: 在主程序中写:COMMON X,Y,I,Z(3) 在子程序中写:COMMON A,B,J,T(3) 于是,在无名公用区中变量X和A,Y和B,I和J分别分配在同一个存储单元中,数组Z和T同占三个存储单元。占同一个存储单元的那些变量在不同的程序单位中,它们的名字不需要相同。

FORTRAN编译程序在编译时为COMMON语句开辟一个无名公用区,当把不同的程序单位连接在一起的时候,不同程序单位在COMMON语句中的变量按其在语句中出现的先后顺序占用无名公用区连续的存储单元,也就是说每个程序单位中的COMMON语句总是给出现在语句中的第一个变量分配在无名公用区的第一个存储区单元。 COMMON语句开辟公用区的主要用途就是使不同程序单位的变量之间 进行数据传送,另一种用途是用来节省存储空间。下面的例子通过公用区进行交换数据: PROGRAM MAIN COMMON Z1,Z2 READ(*,*)A1,A2,A3 CALL QUAD(A1,A2,A3) WRITE(*,*)Z1,Z2 END SUBROUTINE QUAD(A,B,C) COMMON X1,X2 . . . END 或者: PROGRAM MAIN COMMON Z1,Z2,A1,A2,A3 READ(*,*)A1,A2,A3 CALL QUAD() WRITE(*,*)Z1,Z2 END

fortran新建,添加外部文件和简要读写格式说明

1.建立新的运行空间 File>new>workspace>new>prject>console application>new>file>free-form 2.建立多个文件 可以把子程序文件和主程序文件放在同一个source文件下 3.建立外部文件用于读写数据 Open(1,file=’ exam.txt ‘)用于打开文件,其中1为设备号——用一整数表示,exam.txt为要打开的文件名,文件有文件名和文件类型构成,文件名可给出路径如file=’ D:\exam\exam.txt ‘Write(1,*)’学生的成绩为:’用于在写在前面打开的1文件里写数据,其中*和0、5、6是系统预定义的设备号由系统隐含规定。一个文件名只能和一个设备号建立联系,同样一个设备号也只能与一个文件建立联系,一个通过OPEN语句打开并指定了设备号的文件不能再次用OPEN语句打开 Read(1,*)表示从文件里面读取数据,一次读取一个数据,数据间用逗号隔开 每隔一个read语句或write语句默认的换一行读入或写入 Write(1,”(‘输入’)”)=write(1,*) ‘输入’ Write(1,”(‘I3,’输出’,I7)”) x,y结果是x以3个整型字符输出,输出,y以7个整型输出 Read(1,100)或write(1,100)I,j,k 100 format(I3,I7,F6)表示按照100语句的格式读入或输出顺序读写数据: Read(uint设备号,fmt格式说明,end结束语句转移,eor错误语句转移) 输入数据可以按规定的域宽输入,也可以用逗号强制间隔, 1.使用read语句读取数据时,read语句输入表中的数据类型和格式应该与当前指针位置 数据类型和格式一致。 2.使用read语句读取数据时,从当前文件指针开始读取,完成读取后文件指针自动后移一 个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。 3.使用read语句读取时,如果输入表要求输入的数据少于当前记录的数据个数,则多余的 数据将被忽略,下一个read语句从下一个新的记录开始读取数据。相反则继续读取下条数据记录直到读完全部输入数据。 4.使用write语句时,从当前文件指针开始存写,完成存写后文件指针自动后移一个记录, 使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。如果文件已存在,则原文件的数据将丢失。 5.使用write语句写入数据时,从当前的位置开始写入,可使用format语句中的格式说明 及括号和反斜杠/创建多条新纪录写入,完成操作后,文件指针自动后移一个记录。6.使用了read以后,立即使用write语句,将导致写入的数据为最后一个记录,其余的数 据将丢失。如果在文件末尾要写入新的记录可以通过下了语句实现: 100 read(1,*,end=200) Goto 100 200 write(1,*)’’ 7.使用了write语句立即使用read语句会遇到一个文件结束标志。如果写入后要立即进行 读取,需要用OPEN、rewind、backspace等对文件重新定位。 文件打开操作: Open(unit=设备号,file=文件名,access=存取方式,form=存取格式,recl=记录长度,err=错误转移,pad=补加空格,position=读取位置) 如err=100,表示跳到100号语句 Position 为文件位置包括三个格式,ASIS,已存在文件的上一次操作位置为文件的位置,缺

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

脑电数据预处理步骤讲解学习

脑电数据预处理步骤

1)脑电预览。首先要观察被试脑电基本特征,然后剔除原始信号中一些典型的干扰噪声、肌肉运动等所产生的十分明显的波形漂移数据。 2)眼电去除。使用伪迹校正(correction)的方法,即从采集的 EEG 信号中减去受眼电(EOG)伪迹影响的部分。首先寻找眼电的最大绝对值,用最大值的百分数来定义 EOG 伪迹。接着构建平均伪迹,将超过 EOG 最大值某个百分比(如10%)的眼电导联电位识别为 EOG 脉冲,对识别的 EOG 脉冲进行平均,由协方差估计公式(2-1)计算平均 EOG 脉冲和其它电极之间的 EEG 的传递系数 b: b=cov(EOG, EEG)/var(EOG) (2-1) 其中 cov 表示协方差(covariance),var 表示方差(variance)。 最后根据公式(2-2)对受眼动影响的电极在产生眼动的时间段的波形进行校正,点对点地用 EEG 减去 EOG: corrected EEG=original EEG-b×EOG (2-2) 实验中设置最小眨眼次数为 20 次,眨眼持续时间 400ms。 3)事件提取与脑电分段。ERP 是基于事件(刺激)的诱发脑电,所以不同刺激诱发的 ERP 应该分别处理。在听觉认知实验中,多种类型的刺激会重复呈现,而把同种刺激诱发的脑电数据提取出来的过程叫做事件提取。这样,连续的脑电数据就会根据刺激事件为标准划分为若干段等长数据。以实验刺激出现的起始点为 0 时刻点,根据实验出现的事件对应的事件码,将脑电数据划分成许多个数据段,每段为刺激前 100ms 到刺激后 600ms。对每个试次(一个刺激以及相应的一段加工过程)提取一段同样长度的数据段。 4)基线校正。此步骤用于消除自发脑电活动导致的脑电噪声,以 0 时刻点前的数据作为基线,假设 0 时刻点前的脑电信号代表接收刺激时的自发脑电,用 0时刻点后的数据减去 0 时刻点前的各点数据的平均值,可以消除部分的自发脑

fortran语法手册

1F O R T R A N77四则运算符+ - */ ** (其中**表示乘方) 在表达式中按优先级次序由低到高为:+或-→*或/→**→函数→() 2 FORTRAN77变量类型 隐含约定:I-N规则 凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。 如IMPLICIT REAL (I,J) 三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。 数组的说明与使用 使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3) REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如 WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2) 10FORMAT(1X,5(A2,I2,1X,A2,I4)) 使用DATA语句给数组赋初值 变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如 DATA A,B,C/,, DATA A/,B/,C/ DATA A,B,C/3*CHARACTER*6 CHN(10) DATA CHN/10*''/INTEGER NUM(1000) DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/ 3 FORTRAN77程序书写规则

fortran文件操作

fortran文件操作 From: 《Fortran 95 程序设计》彭国伦 1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file 指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901 open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。 STATUS='NEW' 打开一个原本不存在的新文件 STATUS='OLD' 打开一个原来已经存在的文件 STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。 STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。 STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。 !这一栏不给定时,默认为STATUS='UNKNOWN'。 ACCESS='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法:

FORTRAN新建,添加外部文件和简要读写格式说明

1.建立新的运行空间 File>new>workspace>new>prject>console application>new>file>free-form 2.建立多个文件 可以把子程序文件和主程序文件放在同一个source文件下 3.建立外部文件用于读写数据 Open(1,file=’ exam.txt ‘)用于打开文件,其中1为设备号——用一整数表示,exam.txt 为要打开的文件名,文件有文件名和文件类型构成,文件名可给出路径如file=’D:\exam\exam.txt ‘ Write(1,*)’学生的成绩为:’用于在写在前面打开的1文件里写数据,其中*和0、5、6是系统预定义的设备号由系统隐含规定。一个文件名只能和一个设备号建立联系,同样一个设备号也只能与一个文件建立联系,一个通过OPEN语句打开并指定了设备号的文件不能再次用OPEN语句打开 Read(1,*)表示从文件里面读取数据,一次读取一个数据,数据间用逗号隔开 每隔一个read语句或write语句默认的换一行读入或写入 Write(1,”(‘输入’)”)=write(1,*) ‘输入’ Write(1,”(‘I3,’输出’,I7)”) x,y结果是x以3个整型字符输出,输出,y以7个整型输出 Read(1,100)或write(1,100)I,j,k 100 format(I3,I7,F6)表示按照100语句的格式读入或输出顺序读写数据: Read(uint设备号,fmt格式说明,end结束语句转移,eor错误语句转移) 输入数据可以按规定的域宽输入,也可以用逗号强制间隔, 1. 使用read语句读取数据时,read语句输入表中的数据类型和格式应该与当前指针位置 数据类型和格式一致。 2. 使用read语句读取数据时,从当前文件指针开始读取,完成读取后文件指针自动后移一个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。 3. 使用read语句读取时,如果输入表要求输入的数据少于当前记录的数据个数,则多余的数据将被忽略,下一个read语句从下一个新的记录开始读取数据。相反则继续读取下条数据记录直到读完全部输入数据。 4. 使用write语句时,从当前文件指针开始存写,完成存写后文件指针自动后移一个记录,使用OPEN和REWIND语句时,文件指针指向第一个记录,从第一个记录开始读取。如果文件已存在,则原文件的数据将丢失。 5. 使用write语句写入数据时,从当前的位置开始写入,可使用format语句中的格式说明及括号和反斜杠/创建多条新纪录写入,完成操作后,文件指针自动后移一个记录。 6. 使用了read以后,立即使用write语句,将导致写入的数据为最后一个记录,其余的数据将丢失。如果在文件末尾要写入新的记录可以通过下了语句实现: 100 read(1,*,end=200) Goto 100 200 write(1,*)’’ 7. 使用了write语句立即使用read语句会遇到一个文件结束标志。如果写入后要立即进行读取,需要用OPEN、rewind、backspace等对文件重新定位。 文件打开操作: Open(unit=设备号,file=文件名,access=存取方式,form=存取格式,recl=记录长度,err=错误转移,pad=补加空格,position=读取位置) 如err=100,表示跳到 100号语句

fortran用法总结

我的Fortran基本用法小结 周日, 10/14/2007 - 21:00 — gator 一、说明 二、概述 三、数据类型及基本输入输出 四、流程控制 五、循环 六、数组 七、函数 八、文件 一、说明 本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。只读到第九章,主要是3~9 章,都是最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。要想得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础, 看完前九应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起 来了。外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过 之后都没得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果 有不妥的方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。 二、概述 1、名词解释 Fortran=For mula Tran slator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始 ,IBM设计的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一 目标。ortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。 2、Fortran的主要版本及差别 按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortr an90。ortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式, 所以编程时推荐使用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看77程序。以下是77和90的一些格式上的区别。 Fortran 77:固定格式(fixed format),程序代码扩展名:.f或.for (1)若某行以C,c或*开头,则该行被当成注释; (2)每行前六个字符不能写程序代码,可空着,或者1~5字符以数字表明行代码(用作格 式化输入出等);7~72为程序代码编写区;73往后被忽略; (3)太长的话可以续行,所续行的第六个字符必须是"0"以外的任何字符。 Fortran 90:自由格式(free format),扩展名:.f90 (1)以"!"引导注释; (2)每行可132字符,行代码放在每行最前面; (3)以&续行,放在该行末或下行初。 以下都是讨论Fortran 90。 3、Fortran的一些特点,和C的一些不同 其实很多,在下面涉及具体方面时可以看到。这里只是大致提一些。

相关主题