Fortran Coder

查看: 22735|回复: 13
打印 上一主题 下一主题

[文件读写] 需要输入变量参数的程序,如何批量读取并处理不同文件

[复制链接]

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

跳转到指定楼层
楼主
发表于 2019-12-16 20:55:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编译环境为 IVS+IVF

对于不需要在命令行中输入参数的Fortran程序,
我采用do循环和open就可以让它重复生成不同的chem.asc文件(完成我所需的工作)

[Fortran] 纯文本查看 复制代码
      PROGRAM CKINTERP
      IMPLICIT NONE
      INTEGER MDIM,KDIM,IDIM,MAXTP,MAXSP,MAXTB,LIN,LOUT,LTHRM,LINCK,
     &  MAXORD,LIWORK,LRWORK,LCWORK

      PARAMETER(MDIM=10,KDIM=100,IDIM=500,MAXTP=3,MAXSP=12,MAXTB=10,
     &  LIN=15,LOUT=16,LTHRM=17,LINCK=25,MAXORD=10,
     &  LIWORK=40000,LRWORK=40000,LCWORK=10000)

      INTEGER IWORK(LIWORK)
      DOUBLE PRECISION RWORK(LRWORK)
      CHARACTER*16 CWORK(LCWORK)
      LOGICAL L(KDIM)
      integer i
      character*2 filelist
      do i=1,3
      write(filelist,"(i2)") i
      OPEN (LIN,FILE="chem"//trim(adjustl(filelist))//".inp",
     & STATUS='UNKNOWN',  FORM='FORMATTED')
      OPEN (LOUT, FILE="chem"//trim(adjustl(filelist))//".out",
     & FORM='FORMATTED', STATUS='UNKNOWN')
      OPEN (LTHRM, FILE="therm"//trim(adjustl(filelist))//".dat",
     1       FORM='FORMATTED', STATUS='UNKNOWN')
      open(LINCK,file="chem"//trim(adjustl(filelist))//".asc",
     &                 FORM='FORMATTED',STATUS='UNKNOWN')

      CALL CKINTP (MDIM, KDIM, IDIM, MAXTP, MAXSP, MAXTB,
     1                   LIN, LOUT, LTHRM, LINCK, MAXORD,
     2                   LIWORK, IWORK, LRWORK, RWORK, LCWORK, CWORK, L)


但是对于会有需要输入命令行参数的程序,就只能出现运行完成第一个,然后就关闭,运行完成了。
如何让它继续处理第二个chem2.asc 和第三个 chem3.asc?

[Fortran] 纯文本查看 复制代码
        PARAMETER (LENRWK=100000, LENIWK=100000, LENLWK=200, LENCWK=200,
     1           LIN=5, LOUT=6, LREST=14, LSAVE=15, LRCRVR=16,
     2           LINKCK=25)
      DIMENSION RWORK(LENRWK), IWORK(LENIWK)
      CHARACTER CWORK(LENCWK)*16
      LOGICAL LWORK(LENLWK)  
 integer i
      character*2 filelist
      do i=1,3
      write(filelist,"(i2)") i
      OPEN (LINKCK, FORM='FORMATTED',STATUS='UNKNOWN',
     1              FILE="chem"//trim(adjustl(filelist))//".asc")
      OPEN (LREST,  FORM='UNFORMATTED',STATUS='UNKNOWN',
     1              FILE="rest"//trim(adjustl(filelist))//".bin")
      OPEN (LRCRVR, FORM='UNFORMATTED',STATUS='UNKNOWN',
     1              FILE="recov"//trim(adjustl(filelist))//".bin")
      OPEN (LSAVE,  FORM='UNFORMATTED',STATUS='UNKNOWN',
     1              FILE="save"//trim(adjustl(filelist))//".bin")
      CALL PSR (LIN, LOUT, LINKCK,  LREST, LSAVE, LRCRVR, LENLWK,
     1          LWORK, LENIWK, IWORK, LENRWK, RWORK, LENCWK, CWORK)
      STOP
      END


请问应该如何解决这一问题?能够让它重复读取这几个文件并执行?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2019-12-16 21:14:37 | 只看该作者
操作系统的批处理(windows)或 shell(linux)了解一下

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

板凳
发表于 2019-12-17 08:35:43 | 只看该作者

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

地板
 楼主| 发表于 2019-12-17 16:04:35 | 只看该作者
vvt 发表于 2019-12-16 21:14
操作系统的批处理(windows)或 shell(linux)了解一下

好的,我了解一下。主要是想在源程序上改改

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

5#
 楼主| 发表于 2019-12-17 16:05:28 | 只看该作者
necrohan 发表于 2019-12-17 08:35
http://bbs.fcode.cn/thread-2157-1-1.html

主要是没找到源程序修改的思路

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

6#
发表于 2019-12-17 17:04:37 | 只看该作者
落月黎明 发表于 2019-12-17 16:05
主要是没找到源程序修改的思路

没太明白你的意思,你在源程序里不是已经用do循环实现了吗?
如果要反复执行,用输入修改参数,直接 do while true ... end 套在输入参数那部分外面不就行了,用负数判断退出循环。

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

7#
 楼主| 发表于 2019-12-17 19:47:19 | 只看该作者
necrohan 发表于 2019-12-17 17:04
没太明白你的意思,你在源程序里不是已经用do循环实现了吗?
如果要反复执行,用输入修改参数,直接 do w ...

我原以为加上do循环以后,它可以实现打开第一个文件,然后输入参数,运行完成。再打开第二个文件,输入参数,运行完成..........
实际上,在打开完第一个文件之后,输入参数,运行完成。就结束了。
对于不用输入参数的程序,它就可以像我原以为的那样。
感谢回复

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

8#
 楼主| 发表于 2019-12-18 16:50:26 | 只看该作者
vvt 发表于 2019-12-16 21:14
操作系统的批处理(windows)或 shell(linux)了解一下

您好,我了解了一下批处理,但是发现出了一些问题,想请您帮忙看一下。
这是我的批处理文件。我的exe程序是需要一个chem.asc文件,所以我将chem.asc文件与exe程序放到了一个文件夹下。 当我运行我的批处理文件时候,它只有当chem.asc文件与批处理文件在一起时,才能运行成功,并在批处理文件所在的文件夹里生成结果。 但我想要实现的是在他们各自的文件夹里运行,不太明白哪里出错了。
@echo off
E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem1\Console1.exe < E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem1\1.txt
E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem2\Console1.exe < E:\20191028工作\ChemkinIII\Chemkin\Debug\Console1\Console1\chem2\1.txt
echo

之后我采用调用2个批处理文件的方式,集成在同一个批处理文件中。如
call 1.bat
call 2.bat
仍然需要chem.asc文件,并生成结果在当前目录下。

请问这应该如何处理?

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

9#
发表于 2019-12-19 22:41:23 | 只看该作者
本帖最后由 pasuka 于 2019-12-19 22:44 编辑

非要绕开shell,那么就定义结构体,自己编写个namelist来实现
01.asc N1 param01 param02 ... paramN1
02.asc N2 param01 ... paramN2
每次主程序读取namelist然后for循环处理

19

帖子

4

主题

0

精华

入门

F 币
91 元
贡献
49 点

规矩勋章

10#
 楼主| 发表于 2019-12-20 20:42:21 | 只看该作者
pasuka 发表于 2019-12-19 22:41
非要绕开shell,那么就定义结构体,自己编写个namelist来实现
01.asc N1 param01 param02 ... paramN1
02.a ...

感谢回答,我是菜鸟,我得去查查相关内容学习学习
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-22 15:18

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表