Fortran Coder

标题: FORTRAN小白,循环方面 [打印本页]

作者: 18822146653    时间: 2019-9-16 16:17
标题: FORTRAN小白,循环方面
现在我有一个2.DAT文件(时变会覆写),为1列12行,数据格式都一样。
现需要每一行读出来(每一行数据都会随时间变化,且行数挺多),然后需要的行数内容写入到其他的.DAT文件中
不知道该如何用循环做,没有做出来
求助啊


新建文本文档.txt

1.14 KB, 下载次数: 3

没有循环


作者: 胡文刚    时间: 2019-9-17 12:55
[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

作者: 18822146653    时间: 2019-9-17 19:07
胡文刚 发表于 2019-9-17 12:55
[mw_shl_code=fortran,true]Program Main
  Implicit None
  real A(1,12)

嗯嗯,感谢您的回答。我这里还有几个疑问:我C.DAT文件中的数据按照第3到第8行就定义了吗?为A()吗?
作者: 18822146653    时间: 2019-9-17 19:31
胡文刚 发表于 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行,可以给一个注释吗?想了半天不太理解。。。外行
作者: 胡文刚    时间: 2019-9-17 20:54
①这个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'
拼接成一个文件名(注意文件名是用字符串来表达的)
拼接成文件名之后,打开这个文件。
作者: 18822146653    时间: 2019-9-18 09:59
胡文刚 发表于 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)

这些也会失败,真不明白,这样读取每行数据有什么不对。
作者: 18822146653    时间: 2019-9-18 10:46
胡文刚 发表于 2019-9-17 20:54
①这个C是什么意思呢?
C是一个字符串,用来临时存储 i 转换成的字符串,比如 “1” 或 “2” 这样的字符串 ...

是不是只有一个READ时候,不管是多少行的数据,读的都是第一行啊?我试了几次都是读的第一行的///
作者: 胡文刚    时间: 2019-9-18 11:02
为什么这样定义CHARACTER(LEN=16)::C呢?为什么要长度为16
因为整数要转换(写入)成字符串,32位整数最多可以有10位数。定义16长度是足够的。
当然你定义更长也可以,比如20,更短一些,比如13也可以。
对于字符串来说,不需要“恰好足够长”,一般会预留一些,不容易出错。

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

Read是读取当前位置的内容。一般来说,打开一个文件,则刚开始的“位置”在文件的首部。
作者: 18822146653    时间: 2019-9-18 11:49
胡文刚 发表于 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中,出错了,就说子程序错误,没有任何别的提示,哎,所以只能笨不啦叽的改。我尝试着用过您的哪个代码,还是失败了
作者: 胡文刚    时间: 2019-9-18 15:51
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

作者: 18822146653    时间: 2019-9-18 23:16
胡文刚 发表于 2019-9-18 15:51
Abaqus不知道怎么用。
我自己单独运行,测试是没问题的。

嗯,非常非常感谢您,我自己的问题再找找原因,哎,软件让人头大




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2