从具有非前进I / O的文件中读取和计数(双精度)实数:要使用哪个编辑描述符?

时间:2014-11-05 18:34:57

标签: fortran

我正在尝试将外部文件中的实数列表读入数组。我不知道有多少记录字段,用空格分隔,文件中有每条记录,因此我计划使用非前进的I / O来首先计算的数量记录字段,然后分配一个足够大小的实数组,最后将文件读入同一个数组。

这是一个示例输入文件(每个记录字段的编辑描述符应该是f3.1,即浮点数3个字符宽,带一个小数,并计算点;但是如果我正确地阅读了Metcalf等人,忽略了小数):

1.0 2.0 3.0 4.0 5.0

我的程序的MWE看起来像这样

program testread
    use iso_fortran_env

    implicit none

    character(len=255) :: filename

    filename = 'read.dat'

    print *, count_entries(filename)

    contains
        integer function count_entries(coefficient_file) result(n)
            character(len=*), intent(in) :: coefficient_file
            !real, dimension(:), allocatable :: coefficients

            integer :: fileunit, stat
            real :: temp

            n=0

            open(newunit=fileunit, file=coefficient_file, iostat=stat)
                do
                    read(fileunit,'(f3.1)',advance='no',iostat=stat) temp
                    if (stat == iostat_end) then
                        exit
                    else
                        n = n + 1
                    end if
                    print *, stat, temp
                end do
            close(fileunit)

            ! What should happen in the future...
            !allocate(coefficients(n))
            !read(fileunit,*,iostat=stat) coefficients
        end function count_entries

end program testread

如果您将上面的示例输入保存为read.dat,请使用gfortran -o testread{,.f90}编译程序并执行它,您将得到以下结果:

   0   1.00000000    
   0   2.00000000    
   0  0.300000012    
   0   0.00000000    
   0   4.00000000    
   0   5.00000000    
  -2   0.00000000    
   7

换句话说,不是计算5个条目,而是计数7.这并不奇怪,因为它出于某种原因看到了7个数字。但我想知道:为什么会看到7个数字?如何扩展我的功能a)能够读取更大的实数和b)读取非均匀宽度的实数?例如,我希望能够阅读1.01 1.003 2.1等。

2 个答案:

答案 0 :(得分:2)

它看到六个数字(最后一个是记录条件的结束),因为您的格式规范指定每次读取三个字符,但您的数据每四列间隔一次(三个用于数据,一个用于分隔空白) )。

如果您的输入不是固定格式(列数可能不同),则将整个记录(行)读入character(:), allocatable变量,然后手动将该字符串删除。

(切勿使用具有指定小数位数的格式规范进行输入,除非您知道您的输入始终适合该输入。)

答案 1 :(得分:0)

你忘了考虑这些空间。只需使用'(f3.1,1x)'