forrtl:severe(104):连接文件的STATUS =说明符值不正确,单位为-1,文件为CONOUT $

时间:2018-03-02 10:31:14

标签: fortran fortran2008

我有一个Fortran例程,可以打开很多文本文件,从时间循环中写入数据。此例程使用带有open选项的newunit,此单元存储在对象中,以便稍后在文件中写入内容。这在大多数情况下工作正常,但是当程序需要同时打开大量N个文件时,我收到以下错误:

**forrtl: severe (104): incorrect STATUS= specifier value for connected file, unit -1, file CONOUT$**

open子例程中处理第一个createFiles函数。无论文件是否已存在,都会发生此错误。我不知道这是否有帮助,但在此阶段应该生成的新单位为-32768

我包含一个带有“timeSeries”类的最小代码示例,其中包括一个创建两个文件的例程:

  • 第一个文件fileName1在写完内容后直接打开并关闭
  • 第二个文件fileName2保持打开状态,以便稍后在时间循环中编写内容并在时间循环结束时关闭

该示例由以下两个文件组成。它打破了i = 32639。

main.f90:

program writeFiles

use TS

logical :: stat
integer :: i, istep, N, NtimeSteps
character(len=16) :: fileName1, fileName2
character(len=300) :: path
type(timeSeries), dimension(:), allocatable :: myTS

call getcwd( path )

path = trim(path) // '\Output_files'
inquire(directory = trim(path), exist = stat )
if (.not. stat) call system("mkdir " // '"' // trim(path) // '"' )

N = 50000
NtimeSteps = 100
allocate(myTS(N))

do i = 1, N
    write(fileName1,'(a6,i6.6,a4)') 'file1_', i, '.txt'
    write(fileName2,'(a6,i6.6,a4)') 'file2_', i, '.txt'
    call myTS(i)%createFiles(trim(path),fileName1,fileName2)
end do

do istep = 1, NtimeSteps
    #
    #compute stuff
    #
    do i = 1, N 
         write(myTS(i)%fileUnit,*) 'stuff'
    end do
end do

do i = 1, N
    close(myTS(i)%fileUnit)
end do

end program writeFiles

module.f90:

module TS

    type timeSeries
    integer :: fileUnit

    contains

    procedure :: createFiles       => timeSeries_createFiles

    end type timeSeries

    contains

    subroutine timeSeries_createFiles(this,dir,fileName1,fileName2)
        class(timeSeries) :: this
        character(*) :: dir, fileName1, fileName2 

        open(newunit = this%fileUnit , file = dir // '\' // fileName1, status = 'replace') !error occurs here after multiple function calls
        write(this%fileUnit,*) 'Write stuff'
        close(this%fileUnit)
        open(newunit = this%fileUnit , file = dir // '\' // fileName2, status = 'replace') 
    end subroutine timeSeries_createFiles

end module

有关此错误原因的任何想法?同时打开的文件数量是否有限制?它可能与内存问题有关吗?

我正在使用英特尔(R)Visual Fortran编译器17.0.4.210

1 个答案:

答案 0 :(得分:3)

Windows有一个有趣的习惯,即在关闭后不会在短时间内释放已关闭文件的所有资源。几十年来我一直在看这种问题。我通常建议在CLOSE之后调用SLEEPQQ,持续时间为半秒,当你打算在同一个文件后不久打开另一个OPEN时。但你不是在这里做的。

这里有更多令人费解的事情。打开显式文件并使用NEWUNIT时,不应出现引用单元-1和CONOUT $的错误消息。在英特尔的实施中,NEWUNIT的数字从-129开始,从那里开始更负面。单位-1用于PRINT或WRITE(*),CONOUT $用作控制台。 STATUS ='REPLACE'对连接到控制台的设备无效。新单元号为-32768,这说明了英特尔库中NEWUNIT的内部限制。

我做了自己的测试,看到如果你使用NEWUNIT并关闭装置,单位数字会低至-16384,然后再循环回-129。如果确实你关闭了单位,那就没关系,但是你永远不会关闭你打开的第二个文件,所以你至少要打开最多的NEWUNIT文件。我建议找出一种不同的方法来解决问题,这种方法不需要打开数千个文件。