Fortran进行批处理的方法

上传人:cl****1 文档编号:551743080 上传时间:2022-10-30 格式:DOC 页数:10 大小:21.50KB
返回 下载 相关 举报
Fortran进行批处理的方法_第1页
第1页 / 共10页
Fortran进行批处理的方法_第2页
第2页 / 共10页
Fortran进行批处理的方法_第3页
第3页 / 共10页
Fortran进行批处理的方法_第4页
第4页 / 共10页
Fortran进行批处理的方法_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Fortran进行批处理的方法》由会员分享,可在线阅读,更多相关《Fortran进行批处理的方法(10页珍藏版)》请在金锄头文库上搜索。

1、Fortran进展批处理的方法 - 教育文库 Fortran中批量处理文件的方法总结 循环读取目录下的所有符合条件的文件 = 一、简单的介绍 在一年之前,我写过一个程序,主要是对Micaps资料进展批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开场关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。 对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,假如你不懂原理,估计现成的程序你使用起来也会碰壁哦!

2、 这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。 我总结的批处理方法大概可以用下面这个示意图来说明: | | |将文件目录写入一个文本文件,供fortran循环读取 |手动输入文件名 |运行程序之前命令行工具导出文件名 |程序运行后,未开场计算之前,生成文件名 | 调用CMD命令生成 | GETFILEINFOQQ方法生成 | 调用WIN32API生成 | |在程序运行时动态生成文件名 | | 对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的例如来验证。第二种方法主要是说明其思路。 二、方法的介绍 1、 将文件目录写入一个文本文件,供fortran循环读取

3、 1.1、 手动输入文件名 这是最根本的方法啦,假如文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。 1.2、 运行程序之前命令行工具导出文件名 这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。 a、 从运行工具翻开你的CMD窗口; b、转到要处理的当前目录可省略:CD /d 途径,如: CD /d e:test 这样可以快速到达e:test目录 c、 使用DIR命令列出

4、文件目录信息到指定的文件,通常使用的 Dir *.*新文件名 这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,如今要使用的命令是: DIR /b filternewfile 注意,其中的filter为文件挑选,必须自己修改为所需的,比方你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。 Newfile就是你需要存放文件名的那个文件,比方可以是 dir.txt,这样就成了 dir /b*.txtdir.txt,就会把当前目录下的所有文件都列出到dir.txt文件中,当然,由于dir.txt也在当前目录,所以也会被算进去,这在处理的时候是需要注意

5、的,下面几种方法中同样考虑了这个问题。你可以选择手动删掉,或者把dir.txt这个文件存到其他地方去,或者,不要和你需要的文件具有一样的后缀也行,比方:dir /b *.txte:dir.txt 假设当前目录是e:test 假如省略了第二步中的转到当前目录的话,就需要在dir命令后输入完好的途径了,而且新生成的文件也要选择有权限建立新文件的地方存放,比方你在c:%users目录下输入:dir /b e:test*.txte:dir.txt,这个命令和上面先转到e:test目录下的效果是一样的。 如今你是不是比拟好奇,/b 是干嘛的,其实就是只列出文件名,不要其他的附件信息,比方创立时间,文件大

6、小等等这些对于我们批处理无关的信息。 假如你想包含某个目录下的子目录,那么,就可以这样写: Dir /b/s filternewfile /s就表示包含子目录,但是,这样会有一个问题,那就是,批处理的时候必须获得正确的途径才能操作,这样得到的子目录里面的文件不会有任何标志说他是来自子目录的,因此fortran处理的时候就无法判断了,所以,假如包含了子目录,那么请用下面的命令: Dir /a-d/b/s filternewfile 如今去看看新生成的文件吧,怎么样,很惊喜吧! 懂了这个方法,下面一局部的第一个方法对你来说就是小菜一碟啦。 假如你使用的win7或vista系统,而且无法正常使用CV

7、F编译器的话,那么第一局部到这里就算完毕啦,除非,你会在其他fortran编译器中调用WIN32API。 1.3、程序运行后,未开场计算之前生成文件名 1.3.1、在程序中调用CMD命令 这个方法其实就是上一个方法的进化版,只不过变成了在程序运行的时候调用命令自动生成,这样整个过程显得少一点,只需要在程序里设置好相关的参数即可。 这个方法的关键在于SYSTEMQQ函数的使用,这是CVF编译器封装的调用CMD命令的一个函数,存在于DFLIB库中,其语法命令为: result = SYSTEMQQ(mandline) mandline:表示需要进展的CMD操作,字符串形式,函数中的实际长度由传入的

8、参数决定,input类型表示输入为参数; Results:一个逻辑型变量logical(4),假如成功为true,失败为false不解的是程序中要实现的东西都是正常的,比方仅仅传入dir命令,返回的结果仍然为F,请高手赐教 给出一个简单的例子: USE DFLIB LOGICAL(4)result result = SYSTEMQQ(copy e:dir.txt e:testdir.txt) 这个命令将第一个途径中的文件复制到为第二个途径中的文件。通过这个例子再结合上面一个方法,就可以很方法便的构造出我们需要用来批处理的子函数,关键语句如下所示: subroutine ListToFile(f

9、Path,outPut) character*(*),InTent(In): fPath,outPut character*100CMD LOGICAL(4) res 其中传入的是文件挑选值和输出的途径,这个方法也是我在第一局部中最为推荐的一个方法了,代码简洁高效,可以输出完好的途径,可以包含子文件夹,唯一的缺点就是输出的文件个数不能直接在程序中调用方便循环,需要在批处理的时候使用其他方法来判断文件是否读取完毕。 1.3.2、使用GETFILEINFOQQ方法生成文件目录 该方法是下面一个方法的进化版,是由CVF对WIN32的API进展了封装,这样,我们就可以通过简单的调用函数来实现一些面向对

10、象的功能。简单的翻译了一下官方给出的GETFILEINFOQQ函数信息: Module: USE DFLIB 存在于DFLIB库中 语法简介: Syntax result = GETFILEINFOQQ (files, buffer, handle) files :输入类型的字符型变量,表示你需要查找的途径也就是我们上面方法中的挑选值,同样可以使用*或者?这样的通配符。 buffer :在函数运行中会获得一个值,可供输出使用,这个值就是所找到的文件的 ,属于FILE$INFO类型的变量该类型定义于:fortran安装途径 DF98INCLUDE途径下,其构造如下: TYPE FILE$INFO

11、 handle :承受输入和输出整型变量,表示文件控制信息同样在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。 理解了以上信息,我们就可以通过编程进展循环调用这个函数,每找到一个符合条件的文件,就把他输入到指定途径的文件中去,注意,但凡in

12、put类型的变量都必须传入数值,否那么会出错。 假如你比拟有探究精神,就试着用这个介绍和思路来编程一下吧,子程序如下所示完好的请下载附件 Subroutine GetFileList(cFileName,outPut,iFile) UseDFLib,only:GetFileInfoQQ,GetLastErrorQQ,FILE$INFO,FILE$LAST,FILE$ERROR,FILE$FIRST,ERR$NOMEM,ERR$NOENT,FILE$DIR !引入库函数 Implicit None !根据上面的语法介绍来定义变量 Character*(*),Intent(In):cFileNam

13、e !挑选值 character*(*),intent(In):output !输出途径 Integer,Intent(InOut):iFile !记录已经找到几个文件 TYPE (FILE$INFO) info !找到的文件的信息 INTEGER(4):Wildhandle,length !文件控制信息,文件大小, Wildhandle = FILE$FIRST iFile = 0 DOWHILE (.TRUE.) !循环找文件 length = GetFileInfoQQ(cFileName,info,Wildhandle) !调用函数找文件 !假如遇到错误或者不能再找到不同的文件,那么进

14、入选择,准备退出 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 iFile= iFile + 1 注意,在调用子函数输出文件名时,要做一些处理,主要是判断文件是否存在不存在那么新建,假如是第一次找到,而且文件存在,那么覆盖,

15、否那么追加,以及找到的是否为我们自己建立的这个dir.txt文件假如是,那么忽略,找到的文件数量-1 这个方法也不错,假如不需要子目录的信息,其优越性不亚于上一种方法,因为该子函数可以直接返回找到的文件数量。 1.3.3调用WIN32API生成目录下的文件信息 有了上面的几种方法,其实这个方法可以不需要介绍,但是也许有和我一样喜欢刨根问底的朋友,还是贴出来,也算是分享一下CVF平台下对于API的调用方法。 fortran的最大强项是数值计算,他本身对于各种系统信息的处理功能实在不敢说好,假如要实现一些交互的功能目前来说还是比拟复杂的。 该方法直接调用系统的API函数来实现功能,理论上只要是fortran编译器支持API调用,就可以使用该方法,也就是说可以用于win7

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 演讲稿/致辞

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号