Fortran读取文本文件

问题描述 投票:0回答:1

我有一个这样写的文件

N
                1000
NNODES
                   3
TURB_INT
             0.20000
U_MEAN
                  30
TYPE_GP
                 dav
L
                 120
WIND_TURB
              NODE_1              NODE_2              NODE_3

             0.90139            -1.02858             0.03962
            -2.56887            -1.59726            -0.82062
            -0.58745             0.72129            -1.90712
            -4.46302            -2.49995            -5.45345
            -4.10550            -5.50565            -7.77285
            -6.18588            -6.34998            -5.95054

我真的很难理解如何阅读。

最后,我最需要的是将NODES记录读入变量WT(i,:),因此我可以使用DO循环。

这里是我所拥有的:

! open inputfile, ID=100
    open(unit=100, file=inputfile, recl=fileln, status='old', iostat=iost)

    print *, iost
    print *, fileln

    if (iost .ne. 0) then 
        print *, 'Error opening file'
        print *, erromsg
    else
        print *, 'File opened correctly'
        print *, erromsg
    end if


    ! Trying to read what's written in file.
    read(unit=100, *) N
    print *, N

    read(unit=100, *) Nval
    print *, Nval

我试图查看如何逐行阅读。我可以读取变量N,但是在第二次读取时(第2行),我显示为“ severe(24):读取期间文件结束”。

请您告诉我吗?谢谢

fortran readfile intel-fortran
1个回答
1
投票

我认为您应该阅读公开声明的正确标志。关键字recl用于直接访问文件。这意味着每个记录都具有相同的长度,因此,如果您需要第64条记录,程序将立即知道该记录在哪里。

如果您的文件具有记录长度,则看不到。正如我在评论中所说,我非常怀疑fileln是文件的字节长度(您没有说)。因此,在您第一次读取时,将读取第一条记录(即文件的整个记录​​),然后将其解析为变量N -该变量只能使用一个整数,然后丢弃所有其他内容。

然后,它尝试读取文件结尾之后的下一个fileln字节,这将导致'文件结尾'错误。

根据您的情况,我将在文件action="READ"语句中添加form="FORMATTED"open关键字。而且我总是发现不仅查找错误代码,而且查找错误消息iomsg也很有用。

关于它的价值,这是我对如何读取文件的建议:

program readfile
    implicit none
    integer :: u  ! File handle
    integer :: ios
    character(len=100) :: iom, line
    integer :: N, NNodes, U_Mean, L
    real :: Turb_Int
    character(len=20) :: Type_GP
    real, allocatable :: node_values(:)
    character(len=10), allocatable :: node_names(:)

    ! newunit, instead of unit, creates a new unique
    ! file unit number. You could also set u to 100
    ! and then use unit=u
    open(newunit=u, file='data.txt', action='READ', &
        status='OLD', form='FORMATTED', iostat=ios, &
        iomsg=iom)

    if (ios /= 0) then
        print *, "Error opening file:"
        print *, iom
        stop 1
    end if

    ! Read the header. I'm always reading 'line' when
    ! I expect there to be just the next keyword
    ! in the line. You might want to check for that
    read(u, *) line   ! Hopefully 'N'
    read(u, *) N
    read(u, *) line   ! Hopefully "NNODES"
    read(u, *) NNodes
    ! I assume that NNODES stands for the number
    ! of columns later in the file.
    ! So here I'm also allocating the arrays.
    allocate(node_values(NNodes))
    allocate(node_names(NNodes))
    read(u, *) line   ! Hopefully TURB_INT
    read(u, *) Turb_Int
    read(u, *) line   ! Hopefully U_MEN
    read(u, *) U_Mean
    read(u, *) line   ! Hopefully TYPE_GP
    read(u, *) Type_GP
    read(u, *) line   ! Hopefully L
    read(u, *) L
    read(u, *) line   ! Hopefully WIND_TURB
    read(u, *) node_names

    ! Just print out what we got from the header so far to see
    ! everyting's right
    write(*, '(A, I0)') "N = ", N
    write(*, '(A, I0)') "NNodes = ", NNodes
    write(*, '(A, F5.1)') "Turb_Int = ", Turb_Int
    write(*, '(A, I0)') "U_Mean = ", U_Mean
    write(*, '(A, A)') "Type_GP = ", trim(Type_GP)
    write(*, '(A, I0)') "L = ", L
    write(*, '(A, *(A))') node_names

    ! Now read the data itself. In this case I'm just reading it
    ! line by line, print it out, and forget it again
    ! until the end of the file.
    data_loop : do
        read(u, *, iostat=ios, iomsg=iom) node_values
        if (ios /= 0) exit data_loop
        print *, node_values
    end do data_loop
end program readfile
© www.soinside.com 2019 - 2024. All rights reserved.