Fortran Coder

标题: 老哥救救弟弟,程序报错forrtl: severe (24): end-of-file during read, [打印本页]

作者: JackMa    时间: 2020-3-30 23:45
标题: 老哥救救弟弟,程序报错forrtl: severe (24): end-of-file during read,
本帖最后由 JackMa 于 2020-3-31 13:01 编辑

各位老哥,小弟我用FORTRAN读取一个txt文件,结果报错forrtl: severe (24): end-of-file during read,了,查了百度也没解决,我自己也看了我的代码,应该没问题啊,老哥们帮帮忙!




作者: fcode    时间: 2020-3-31 09:21
如果你要持续等待文件是否可读可写。那么 Inquire 是无法实现的。
它只能判断是否存在,但存在可能无法读写(此时Abaqus还没有释放文件)
所以读取就可能失败。

比如好的办法是这样:
[Fortran] 纯文本查看 复制代码
Do
  open(222,file ='D:\ABAQUS job\FP2.txt',ioStat=k,action="readwrite",status="old")
  if(k==0) then
    read(222,*),a2,g2,n2
    close(222)
  end if  
End Do

作者: JackMa    时间: 2020-3-31 09:31
fcode 发表于 2020-3-31 09:21
如果你要持续等待文件是否可读可写。那么 Inquire 是无法实现的。
它只能判断是否存在,但存在可能无法读写 ...

谢谢老哥,我试试看
作者: JackMa    时间: 2020-3-31 10:11
本帖最后由 JackMa 于 2020-3-31 13:03 编辑
fcode 发表于 2020-3-31 09:21
如果你要持续等待文件是否可读可写。那么 Inquire 是无法实现的。
它只能判断是否存在,但存在可能无法读写 ...

老哥,我按着你说的改了之后,之前的报错确实没有了,但ABAQUS一直不计算,是不是要在里面再加一个控制读取次数的限制?



作者: JackMa    时间: 2020-3-31 10:54
fcode 发表于 2020-3-31 09:21
如果你要持续等待文件是否可读可写。那么 Inquire 是无法实现的。
它只能判断是否存在,但存在可能无法读写 ...

老哥,我又加了控制读取次数就解决了,感谢老哥帮忙,谢谢老哥,抱拳了
作者: wzjdse    时间: 2020-8-19 17:57
fcode 发表于 2020-3-31 09:21
如果你要持续等待文件是否可读可写。那么 Inquire 是无法实现的。
它只能判断是否存在,但存在可能无法读写 ...

按照您指导的,我改了我的代码:
[Fortran] 纯文本查看 复制代码
      !只读入一次
      if (stepTime.eq.0) then
         
          !读入轴承力Fx数据
          do ix=1,10001
              open(11,file='D:\temp\xdata.txt',ioStat=krl,
     &        action="readwrite",status="old")
              if(krl==0) then
                  read(11,*)Fxm(ix,1),Fxm(ix,2)    !循环写入
                  close(11)
              end if
          end do
      
          !读入轴承力Fy数据
          do iy=1,10001
              open(11,file='D:\temp\ydata.txt',ioStat=krl,
     &        action="readwrite",status="old")
              if(krl==0) then
                  read(11,*)Fym(iy,1),Fym(iy,2)    !循环写入
                  close(11)
              end if
          end do
         
      end if


出现了新的报错信息:forrtl: severe (29): file not found, unit 11, file C:\Users\WANGZI~1\AppData\Local\Temp\WangZijia_Housing_21424\fort.11

想请教一下您什么问题
作者: wzjdse    时间: 2020-8-19 18:09
我的思路其实很简答,仿真最开始,读入一个已经存在的txt,之后就不读了(之前方法比较笨,想着是每次abaqus调用子程序时都要读一遍这个txt,但是发现会报错forrtl: severe (24): end-of-file during read,所以正好优化一下只读一次)。麻烦大神帮我看看我上楼贴的代码正不正确。(我的txt里是10001行,2列的数据,代码前面也已经声明数组了)
作者: 风平老涡    时间: 2020-8-20 02:01
1,你肯定在D:\temp\下有xdata.txt文件?根据你的出错,你的运行程序是在\Temp\WangZijia_Housing_21424\.
2,在你这段程序中,文件会被开关10001次,并且只有第一行数据会被读入。
作者: 风平老涡    时间: 2020-8-20 02:08
另,在open行后加 & 作为续行标志。
作者: wzjdse    时间: 2020-8-20 08:30
风平老涡 发表于 2020-8-20 02:01
1,你肯定在D:\temp\下有xdata.txt文件?根据你的出错,你的运行程序是在\Temp\WangZijia_Housing_21424\.
...

额,确实D:\temp\下又文件,这个反复检查过了。楼上这段代码是根据二楼的回答改的一版,不知道改的对不对。我原来的程序是:
[Fortran] 纯文本查看 复制代码
      !只读入一次
      if (stepTime.eq.0) then
         
          !读入轴承力Fx数据
          open(55,file='D:\temp\xdata.txt',status='old')
          do ix=1,10001
              read(55,*)Fxm(ix,1),Fxm(ix,2)    !循环写入
          end do
          close(55)
      
          !读入轴承力Fy数据
          open(22,file='D:\temp\ydata.txt',status='old')
          do iy=1,10001
              read(22,*)Fym(iy,1),Fym(iy,2)    !循环写入
          end do
          close(22)
         
      end if


这种情况,会报错:forrtl: severe (24): end-of-file during read, unit 55, file D:\temp\xdata.txt。网友说这是对同一个TXT多次读取导致的,但是我感觉设计的程序是只读了一次,就是在仿真刚开始的时候。不太懂abaqus是怎么调用.for的。我看到的说法是每个积分步起始时刻,他会释放steptime等参数给.for,然后子程序计算返回节点力(我的是vdload程序)
作者: 风平老涡    时间: 2020-8-21 00:02
看这里
http://bbs.fcode.cn/thread-2471-2-1.html






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