Fortran Coder

查看: 109|回复: 10

[流程控制] FORTRAN小白,循环方面

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
发表于 2019-9-16 16:17:01 | 显示全部楼层 |阅读模式
现在我有一个2.DAT文件(时变会覆写),为1列12行,数据格式都一样。
现需要每一行读出来(每一行数据都会随时间变化,且行数挺多),然后需要的行数内容写入到其他的.DAT文件中
不知道该如何用循环做,没有做出来
求助啊


新建文本文档.txt

1.14 KB, 下载次数: 3

没有循环

回复

使用道具 举报

47

帖子

0

主题

0

精华

专家

F 币
338 元
贡献
147 点

规矩勋章元老勋章新人勋章

发表于 2019-9-17 12:55:50 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
Program Main
  Implicit None
  real A(1,12)
  character(len=16) :: c
  Integer :: i
  Open(17,FILE='E:\tempabaqus\C.DAT')
  Do i = 1 , 12
    READ(17,*)A(:,i)
  End Do
  Do i = 1 , 8
    write(c,*) i
    Open(99+i,FILE='E:\tempabaqus\'//trim(adjustl(c))//'.DAT')
  End Do
  Do i = 1 , 11
    WRITE(99+i,150)A(:,i)
  End Do
150 FORMAT(F20.10,5X)
End Program Main
天之道,损有余而补不足

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
 楼主| 发表于 2019-9-17 19:07:27 | 显示全部楼层
胡文刚 发表于 2019-9-17 12:55
[mw_shl_code=fortran,true]Program Main
  Implicit None
  real A(1,12)

嗯嗯,感谢您的回答。我这里还有几个疑问:我C.DAT文件中的数据按照第3到第8行就定义了吗?为A()吗?

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
 楼主| 发表于 2019-9-17 19:31:30 | 显示全部楼层
胡文刚 发表于 2019-9-17 12:55
[mw_shl_code=fortran,true]Program Main
  Implicit None
  real A(1,12)

刚才添加进去,运行了一下,还是不行。
有几个问题:①这个C是什么意思呢?
②我C.DAT文件只是1列12行数字,也没有变量定义,这样就定义了吗?
③第12行‘//trim(adjustl(c))//’是什么意思呢?我自己创建了几个.DAT空文件,如何写入这些文件中呢?
④第10行~11行,可以给一个注释吗?想了半天不太理解。。。外行

47

帖子

0

主题

0

精华

专家

F 币
338 元
贡献
147 点

规矩勋章元老勋章新人勋章

发表于 2019-9-17 20:54:52 | 显示全部楼层
①这个C是什么意思呢?
C是一个字符串,用来临时存储 i 转换成的字符串,比如 “1” 或 “2” 这样的字符串
后面会用到它来拼成文件名“1.dat”或“2.dat”这样的
②我C.DAT文件只是1列12行数字,也没有变量定义,这样就定义了吗?
文件内容是文件内容,变量是变量。两回事。
你的变量是 real A(1,12) 定义的。
这个 A变量的值,可以从文件 c.dat 中获取,也可以不从这里获取。
文件 c.dat 里的内容,可以存成一个变量(很长的字符串),也可以转换(读取)成12个单变量,也可以转换(读取)成3*4的数组,或者2*6的数组,或者一个5大小的数组+一个7大小的数组。
这是非常灵活的,取决于代码怎么写,你的逻辑需求是怎样的。
变量和文件内容,不是一回事。别混淆了。
③第12行‘//trim(adjustl(c))//’是什么意思呢?
// 用于拼接字符串。
adjustl 用于把字符串左对齐。
trim 用于把字符串后面多余的空格去掉。
C 字符串的值可能是 “   1  ”或别的。
必须先经过左对齐和去除多余的空格,否则拼接出来可能是:
E:\tempabaqus\    1    .DAT
或者
E:\tempabaqus\1    .DAT
而先 adjustl 然后 trim 之后,拼接的就是正确的
E:\tempabaqus\1.DAT

我自己创建了几个.DAT空文件,如何写入这些文件中呢?
文件不能再写入文件。不存在“文件中的文件”这种东西。
只有变量的值可以转换成(写入)文件的内容。

④第10行~11行,可以给一个注释吗?想了半天不太理解。。。外行
write(c,*) i
是把 i 这个整形变量,转换成(写入)字符串 c 的内容。
Open(99+i,FILE='E:\tempabaqus\'//trim(adjustl(c))//'.DAT')
这个是把字符串 'E:\tempabaqus\' 和 trim(adjustl(c)) 以及 '.DAT'
拼接成一个文件名(注意文件名是用字符串来表达的)
拼接成文件名之后,打开这个文件。
天之道,损有余而补不足

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
 楼主| 发表于 2019-9-18 09:59:48 | 显示全部楼层
胡文刚 发表于 2019-9-17 20:54
①这个C是什么意思呢?
C是一个字符串,用来临时存储 i 转换成的字符串,比如 “1” 或 “2” 这样的字符串 ...

为什么这样定义CHARACTER(LEN=16)::C呢?为什么要长度为16
我添加进去还是不能运行,哎。。
还有我想问问您:我上传的TXT中,有时候运行也会失败,不清楚是怎么回事?
我这样
[Fortran] 纯文本查看 复制代码
REAL A(1,12)
OPEN(17,FILE='E:\tempabaqus\C.DAT')
READ(17,*)A(:,1)
READ(17,*)A(:,2)
READ(17,*)A(:,3)
READ(17,*)A(:,4)
READ(17,*)A(:,5)
READ(17,*)A(:,6)
READ(17,*)A(:,7)
READ(17,*)A(:,8)
READ(17,*)A(:,9)
READ(17,*)A(:,10)
READ(17,*)A(:,11)
READ(17,*)A(:,12)
OPEN(UNIT=18,FILE='E:\tempabaqus\1.DAT')
OPEN(UNIT=101,FILE='E:\tempabaqus\2.DAT')
OPEN(UNIT=102,FILE='E:\tempabaqus\3.DAT')
OPEN(UNIT=103,FILE='E:\tempabaqus\4.DAT')
OPEN(UNIT=104,FILE='E:\tempabaqus\5.DAT')
OPEN(UNIT=105,FILE='E:\tempabaqus\6.DAT')
OPEN(UNIT=106,FILE='E:\tempabaqus\7.DAT')
OPEN(UNIT=107,FILE='E:\tempabaqus\8.DAT')
WRITE(18,150)A(:,1)
150   FORMAT(F20.10,5X)
      WRITE(101,160)A(:,2)
160   FORMAT(F20.10,5X)
      WRITE(102,170)A(:,3)
170   FORMAT(F20.10,5X)
      WRITE(103,180)A(:,4)
180   FORMAT(F20.10,5X)
      WRITE(104,190)A(:,6)
190   FORMAT(F20.10,5X)
      WRITE(105,200)A(:,8)
200   FORMAT(F20.10,5X)
      WRITE(106,210)A(:,9)
210   FORMAT(F20.10,5X)
      WRITE(107,220)A(:,11)
220   FORMAT(F20.10,5X)

这些也会失败,真不明白,这样读取每行数据有什么不对。

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
 楼主| 发表于 2019-9-18 10:46:35 | 显示全部楼层
胡文刚 发表于 2019-9-17 20:54
①这个C是什么意思呢?
C是一个字符串,用来临时存储 i 转换成的字符串,比如 “1” 或 “2” 这样的字符串 ...

是不是只有一个READ时候,不管是多少行的数据,读的都是第一行啊?我试了几次都是读的第一行的///

47

帖子

0

主题

0

精华

专家

F 币
338 元
贡献
147 点

规矩勋章元老勋章新人勋章

发表于 2019-9-18 11:02:52 | 显示全部楼层
为什么这样定义CHARACTER(LEN=16)::C呢?为什么要长度为16
因为整数要转换(写入)成字符串,32位整数最多可以有10位数。定义16长度是足够的。
当然你定义更长也可以,比如20,更短一些,比如13也可以。
对于字符串来说,不需要“恰好足够长”,一般会预留一些,不容易出错。

出错请给错误提示,否则别人只能爱莫能助。

Read是读取当前位置的内容。一般来说,打开一个文件,则刚开始的“位置”在文件的首部。
天之道,损有余而补不足

11

帖子

3

主题

0

精华

入门

F 币
58 元
贡献
35 点
 楼主| 发表于 2019-9-18 11:49:00 | 显示全部楼层
胡文刚 发表于 2019-9-18 11:02
为什么这样定义CHARACTER(LEN=16)::C呢?为什么要长度为16
因为整数要转换(写入)成字符串,32位整数最多 ...

我试着这样写
[Fortran] 纯文本查看 复制代码
      REAL A(1,12)
      OPEN(UNIT=17,FILE='E:\tempabaqus\C.DAT')
      READ(17,*) A(:,2)
      READ(17,*) A(:,1)
      READ(17,*) A(:,4)
      READ(17,*) A(:,6)
      OPEN(UNIT=101,FILE='E:\tempabaqus\2.DAT')
      OPEN(UNIT=102,FILE='E:\tempabaqus\1.DAT')
      OPEN(UNIT=103,FILE='E:\tempabaqus\4.DAT')
      OPEN(UNIT=104,FILE='E:\tempabaqus\6.DAT')
      WRITE(101,150) A(:,2)
      WRITE(102,150) A(:,1)
      WRITE(103,150) A(:,4)
      WRITE(104,150) A(:,6)
150   FORMAT(F20.10,5X)
      F=-1000
      CLOSE(17)
      CLOSE(101)
      CLOSE(102)
      CLOSE(103)
      CLOSE(104)

最后得到的是C.DAT文件的前四行,一次一行的读。所以,好像跟A(:,I)中的I没有太大关系。因为我是用在ABAQUS中,出错了,就说子程序错误,没有任何别的提示,哎,所以只能笨不啦叽的改。我尝试着用过您的哪个代码,还是失败了

47

帖子

0

主题

0

精华

专家

F 币
338 元
贡献
147 点

规矩勋章元老勋章新人勋章

发表于 2019-9-18 15:51:40 | 显示全部楼层
Abaqus不知道怎么用。
我自己单独运行,测试是没问题的。

[Fortran] 纯文本查看 复制代码
Program Main
  Implicit None
  real a
  character(len=16) :: c
  Integer :: i
  Open(17,FILE='E:\tempabaqus\C.DAT')
  Do i = 1 , 12
    READ(17,*) a
    write(c,*) i
    Open(18,FILE='E:\tempabaqus\'//trim(adjustl(c))//'.DAT')
    write(18,150) a
    Close(18)    
  End Do
150 FORMAT(F20.10,5X)
End Program Main
天之道,损有余而补不足
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-10-21 03:49

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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