我正在尝试将外部文件中的实数列表读入数组。我不知道有多少记录字段,用空格分隔,文件中有每条记录,因此我计划使用非前进的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
等。
答案 0 :(得分:2)
它看到六个数字(最后一个是记录条件的结束),因为您的格式规范指定每次读取三个字符,但您的数据每四列间隔一次(三个用于数据,一个用于分隔空白) )。
如果您的输入不是固定格式(列数可能不同),则将整个记录(行)读入character(:), allocatable
变量,然后手动将该字符串删除。
(切勿使用具有指定小数位数的格式规范进行输入,除非您知道您的输入始终适合该输入。)
答案 1 :(得分:0)
你忘了考虑这些空间。只需使用'(f3.1,1x)'
。