Read scientific formatted numbers from txt

后端 未结 2 588
面向向阳花
面向向阳花 2021-01-24 18:49

I would like to read and store scientific formatted numbers from a txt file, which is formatted and the numbers are separated by tabulator.

This is what I have so far:

2条回答
  •  庸人自扰
    2021-01-24 19:11

    Though there are no direct command to count the number of items in a line, we can count the number of periods or (E|e|D|d) by using the scan command. For example,

    program main
        implicit none
        character(100) str
        integer n  
        read( *, "(a)" ) str
    
        call countreal( str, n )
        print *, "number of items = ", n
    contains
    
    subroutine countreal( str, num )
        implicit none
        character(*), intent(in)  :: str
        integer,      intent(out) :: num
        integer pos, offset
    
        num = 0
        pos = 0
        do
            offset = scan( str( pos + 1 : ), "." )        !! (1) search for periods
            !! offset = scan( str( pos + 1 : ), "EeDd" )  !! (2) search for (E|e|D|d)
    
            if ( offset > 0 ) then
                pos = pos + offset
                num = num + 1
                print *, "pos=", pos, "num=", num   !! just for check
            else
                return
            endif
        enddo
    endsubroutine
    end
    

    Please note that pattern (1) works only when all items have periods, while pattern (2) works only when all items have exponents:

    # When compiled with (1)
    
    $ echo "2.9900  2.8000E-35  2.6300D-35  2.46  2.31" | ./a.out
     pos=           2 num=           1
     pos=          10 num=           2
     pos=          22 num=           3
     pos=          34 num=           4
     pos=          40 num=           5
     number of items =            5
    
    # When compiled with (2)
    
    $ echo "2.9900E-35  2.8000D-35  2.6300e-35  2.4600d-35" | ./a.out
     pos=           7 num=           1
     pos=          19 num=           2
     pos=          31 num=           3
     pos=          43 num=           4
     number of items =            4
    

    For more general purposes, it may be more convenient to write a custom "split()" function that separate items with white spaces (or use an external library that supports a split function).

提交回复
热议问题