gpt4 book ai didi

io - 使用 Fortran 从文件中读取包含逗号分隔 float 的行

转载 作者:行者123 更新时间:2023-12-02 03:32:38 25 4
gpt4 key购买 nike

我有一个包含逗号分隔数字的文本文件,如下所示:

757.76019287, 759.72045898, 760.97259521, 763.45477295, 765.99475098, 770.2713623

尚不清楚此文件中存在多少个这些数字;它有所不同,但仅限于几百个数字。

目标是:

  1. 打开此文件(例如,customwav.txt)并找出此文件中存在多少个数字 --> 将它们转换为整数n .

  2. 将这些数字的内存分配到一个数组中 --> 我已经有可以为我执行此操作的子例程。

  3. 将数字行读入此分配的数组中。

在 Fortran 中执行 1 和 3 的最佳方法是什么?

最佳答案

假设您的文件只有一行,如下所示:

  1. 如果你知道数字的格式,你就可以进行非高级I/O;例如,如果所有数字都是使用 12 个空格的 float ,其中 8 个是小数位,并且它们之间用逗号分隔,后跟空格,最后一个数字后面没有最后的逗号和空格:

        integer, parameter :: DP = selected_real_kind(15,300)
    real(kind=DP) :: x
    real(kind=DP), allocatable :: xall(:)
    integer :: u
    integer :: n
    character(len=2) :: c

    open(newunit=u, file='customwav.txt',status='old',action='read')

    n = 0
    do
    read(u, '(f12.8)', advance='no') x
    n = n + 1
    read(u, '(2a)', advance='no', eor=100) c
    if (c .ne. ', ') STOP 'unknown format'
    end do

    100 write(*,*) n
    allocate(xall(n))

    rewind(u)
    read(u, *) xall
    close(u)

    write(*,*) xall
  2. 如果您不知道格式,或者格式以非常规方式更改,则一种惰性(且低效)的方法是尝试一次读取整个数组。以下愚蠢的代码通过逐一增加大小来尝试此操作,但您可以进行二分。

    integer, parameter :: DP = selected_real_kind(15,300)
    integer, parameter :: MaxN = 1000
    real(kind=DP), dimension(MaxN) :: x
    integer :: u
    integer :: n
    integer :: error

    open(newunit=u, file='customwav.txt',status='old',action='read')

    error = 0
    n = 0
    do while (error.eq.0)
    read(u, *, iostat=error) x(1:n+1)
    if (error .eq. 0) then
    n = n + 1
    rewind(u)
    end if
    end do

    write(*,*) n

    rewind(u)
    read(u, *) x(1:n)
    close(u)

    write(*,*) x(1:n)
  3. 如果允许使用非 Fortran 工具,您可以使用以下 shell 命令计算(单行)文件中的逗号数量

    $ grep -o ',' customwav.txt | wc -l

    所以 float 可能是该数字加一(取决于格式)。对于多行文件,您可以使用

    获取每行的逗号计数列表
    $ f=customwav.txt
    $ for lin in $(seq $(cat $f | wc -l))
    > do
    > sed -n ${lin}'p' $f | grep -o ',' | wc -l
    > done

关于io - 使用 Fortran 从文件中读取包含逗号分隔 float 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com