Fortran 如何检测文件是否已格式化?

Fortran 如何检测文件是否已格式化?,fortran,Fortran,我使用的方法如下。我尝试以默认格式打开一个文件并测试读取它。如果失败(错误或到达文件结尾),则未格式化。但这并不能让我对文件类型有信心,毕竟,为什么一个未格式化的文件不能进行格式化读取,为什么一个格式化的文件不能进行格式化读取。我希望以格式化方式读取的未格式化文件返回最有可能的错误,但不能保证,以未格式化方式读取的格式化文件会给出奇怪的结果,但不会出现错误(测试代码实际上返回文件末尾)。检查文件类型有更好的方法吗?一种方法是以逻辑方式命名文件。 就我个人而言,我使用.dat、.txt或.csv表

我使用的方法如下。我尝试以默认格式打开一个文件并测试读取它。如果失败(错误或到达文件结尾),则未格式化。但这并不能让我对文件类型有信心,毕竟,为什么一个未格式化的文件不能进行格式化读取,为什么一个格式化的文件不能进行格式化读取。我希望以格式化方式读取的未格式化文件返回最有可能的错误,但不能保证,以未格式化方式读取的格式化文件会给出奇怪的结果,但不会出现错误(测试代码实际上返回文件末尾)。检查文件类型有更好的方法吗?

一种方法是以逻辑方式命名文件。 就我个人而言,我使用.dat、.txt或.csv表示格式化数据,使用.bin表示二进制数据。
除非您有数百个以上的文件,否则也许您可以用编辑器打开它们,看看它是什么样子?

一种方法是以逻辑方式命名文件。 就我个人而言,我使用.dat、.txt或.csv表示格式化数据,使用.bin表示二进制数据。 除非你有数百个以上的文件,否则也许你可以用编辑器打开它们,看看它是什么样子?

简短回答 格式化文件主要包含ASCII码。处理器和实现允许使用非ascii,将它们写入文件是可以的,但如果以格式化方式读取,则将它们读回可能是一个问题。假设格式化文件只有ASCII字符,且未格式化文件不限于文本,则以下子例程将执行此任务

!
subroutine detect_format(fName)
    character(*), intent(in) :: fName
    integer :: fId, stat
    character :: c
    logical :: formatted
    !
    stat = 0
    formatted = .true. !assume formatted
    open(newunit=fId,file=fName,status='old',form='unformatted',recl=1)
    ! I assume that it fails only on the end of file
    do while((stat==0).and.formatted)
        read(fId, iostat=stat)c
        formatted = formatted.and.( iachar(c)<=127 )
    end do
    if(formatted)then
        print*, trim(fName), ' is a formatted file'
    else
        print*, trim(fName), ' is an unformatted file'
    end if
    close(fId)
    !
end subroutine detect_format
!
子例程detect_格式(fName)
字符(*),目的(in)::fName
整数::fId,stat
字符::c
逻辑::格式化
!
统计=0
格式化=.true!假定格式化
打开(newunit=fId,file=fName,status='old',form='unformatted',recl=1)
! 我假设它只在文件末尾失败
执行while((stat==0.and.formatted)
读取(fId,iostat=stat)c
格式化=格式化。和。(iachar(c)简短回答
格式化文件主要包含ASCII。处理器和实现允许使用非ASCII,将它们写入文件是可以的,但如果读取为格式化文件,则将它们读回可能会有问题。假设格式化文件只有ASCII字符,并且未格式化文件不限于文本,则以下子例程将执行此任务

!
subroutine detect_format(fName)
    character(*), intent(in) :: fName
    integer :: fId, stat
    character :: c
    logical :: formatted
    !
    stat = 0
    formatted = .true. !assume formatted
    open(newunit=fId,file=fName,status='old',form='unformatted',recl=1)
    ! I assume that it fails only on the end of file
    do while((stat==0).and.formatted)
        read(fId, iostat=stat)c
        formatted = formatted.and.( iachar(c)<=127 )
    end do
    if(formatted)then
        print*, trim(fName), ' is a formatted file'
    else
        print*, trim(fName), ' is an unformatted file'
    end if
    close(fId)
    !
end subroutine detect_format
!
子例程detect_格式(fName)
字符(*),目的(in)::fName
整数::fId,stat
字符::c
逻辑::格式化
!
统计=0
格式化=.true!假定已格式化
打开(newunit=fId,file=fName,status='old',form='unformatted',recl=1)
!我假设它只在文件末尾失败
执行while((stat==0.and.formatted)
读取(fId,iostat=stat)c

格式化=格式化。和。(iachar(c)什么是上下文意味着您需要从文件内容中检测此内容?这取决于您对文件内容的期望。格式化文件应包含文本,因此,如果您不期望未格式化文件包含文本,则可以检查是否包含文本。可能最可靠、最简单的方法是以一种方式打开文件,然后在需要时尝试读取不成功,那一定是另一种方式。@lanH,我以前是以格式化文件的形式输出的,但最近文件太大了,所以我想将其更改为未格式化文件,所以我需要自动检测哪种类型以实现向后兼容性。让我困惑的是,我从Metcalf和Reid的fortran手册中读到,说每个read语句都会获取一个rec文件中的ord(我相信是由写语句生成的)然后我应该能够根据一次读取的成功做出判断。但结果是,当格式化文件被读取为未格式化文件时,它将到达文件末尾。对此有什么想法吗?文件末尾是一个错误,所以说“无错误,但文件结尾”毫无意义。无论如何,显示旧格式化文件的外观和fir可能会很有用st
read
statement什么是上下文意味着您需要从文件内容中检测此内容?这取决于您对文件内容的期望。格式化文件应包含文本,因此,如果您不期望未格式化文件包含文本,您可以检查此情况。也许最可靠、最简单的方法是打开文件以一种方式尝试读取,如果不成功,那么一定是另一种方式。@lanH,我以前是以格式化文件的形式输出的,但最近文件太大了,所以我想将其更改为未格式化文件,所以我需要自动检测哪种类型以启用向后兼容性。让我困惑的是,我从Metcalf和Reid的fortran书籍中读到了each read语句从文件中获取一条记录(我相信这是由write语句生成的)然后我应该能够根据一次读取的成功做出判断。但结果是,当格式化文件被读取为未格式化文件时,它将到达文件末尾。对此有什么想法吗?文件末尾是一个错误,所以说“无错误,但文件结尾”毫无意义。无论如何,显示旧格式化文件的外观和fir可能会很有用st
read
statement文件中是否有类似的标志可以快速显示其是否已格式化?为什么fortran标准中没有提供此标志?不幸的是,我不知道。文件中是否有类似的标志可以快速显示其是否已格式化d或未格式化?为什么fortran标准中没有提供此标志?不幸的是,我不知道有什么原因。