Fortran从文件中读取字符 - 无输出

时间:2017-07-13 23:27:11

标签: io fortran

所以我试图理解一些基本的fortran IO并遇到麻烦。我写了以下

program RFF
implicit none
! Variables
integer :: ierr    
character (:), allocatable :: Filename     
character (:), allocatable :: read_in 

! Body of RFF
Filename = 'string_test.txt' 
open(10, file=Filename, status='old', action='read',iostat=ierr) !What is iostat? 

do while (ierr.eq.0) !What is this do loop doing exactly? 
    read(10,'(A)',iostat = ierr) read_in !What does '(A)' mean? I know it's a format descriptor, but nothing beyond that 
    print*, read_in !Nothing gets output to the terminal here        
enddo

write(*,*) 'Press Enter to Exit'
read(*,*) 

!Is deallocating dynamically allocatable strings something I should do? 
deallocate(Filename) 
end program RFF

我已经提供了包含“任意”一词的非常简单的文本文件而没有其他内容。当我运行程序时,没有任何事情崩溃,但也没有任何东西输出到终端。有人可以帮我理解发生了什么吗?注意我已经在我粘贴的代码的注释中插入了许多其他问题。我也希望帮助理解这些。

谢谢

2 个答案:

答案 0 :(得分:1)

真正的问题是,在使用read分配iostat之前,您必须先分配program main implicit none character(len=20) :: read_in ! fixed-length string character(len=:), allocatable :: word, filename ! allocatable strings integer :: iostat_1, iostat_2 ! status indicators integer :: lun ! file logical unit number filename = 'read_test.txt' ! allocate on assignment iostat_1 = 0 ! initialization iostat_2 = 0 open(newunit=lun, file=filename, status='old', iostat=iostat_1) if (iostat_1 == 0) then ! no error occurred do while(iostat_2 == 0) ! continues until error/end of file read(lun, '(a)', iostat=iostat_2) read_in if (iostat_2 == 0) then word = trim(read_in) ! allocate on assignment to trimmed length. endif enddo if (allocated(word)) then print *, "read_in:", read_in print *, "len(read_in)", len(read_in) print *, "Word:", word print *, "len(word)=", len(word) else print *, "Word was not allocated!" endif endif end program main 。另一件事: read_in:arbitrary len(read_in) 20 Word:arbitrary len(word)= 9 用于表示完成状态或可能的错误情况。有关其他详细信息,请参阅代码注释和官方文档(例如,GET Bucket (List Objects) Version 2)。

这是一个有效的解决方案:

if(property_exist($Invoice,'DocNumber')){ echo "exist"; }

示例输出:

 if(property_exist('Invoice','_data')){ echo "exist"; } 

答案 1 :(得分:0)

您的一个代码中有两个问题,请让我先解决一下:

  • 什么是iostat - iostat是与I / O语句相关的错误代码。如果一切正常,它将被设置为0,如果没有,它将具有非零值。尝试打开文件时出现问题的示例:

    • 文件不存在
    • 目录不存在
    • 用户无权打开文件
  • 什么是(A) - 这是格式字符串。 (A)指的是任意长度的字符串。有关详细信息,请参阅here

代码看起来好像应该有效,但结果并不是您所期望的。我想到了两种可能性:

  1. 您尝试读取的文件不存在,或者您正在执行该程序的目录中不存在,或者您没有读取它的权限。这导致ierr被设置为非零错误代码(对应于'未找到文件')。这导致do循环甚至不执行一次,因为ierr不是零开始。

    除了iomsg之外,我建议使用较新的iostat语句。 iomsg是一个字符串,对应于出现问题的人类可读解释。

    character(len=100) :: iomsg
    <snip>
    open(10, file=Filename, status='old', action='read',iostat=ierr, iomsg=iomsg)
    if (ierr /= 0) then
        print*, "Error opening file " // trim(Filename)
        print*, iomsg
        STOP 1
    end if
    
  2. 该文件存在,但为空。这将导致无法打印。只需检查以确保文件中没有任何更改。

  3. 提示,iostatiomsg都可用于所有文件I / O操作,readwrite甚至close也是如此。使用它们不会有害。