Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Text 从txt中读取科学格式的数字_Text_Fortran_Multiple Columns_Scientific Notation - Fatal编程技术网

Text 从txt中读取科学格式的数字

Text 从txt中读取科学格式的数字,text,fortran,multiple-columns,scientific-notation,Text,Fortran,Multiple Columns,Scientific Notation,我想从一个txt文件中读取和存储科学格式的数字,该文件是格式化的,数字由制表器分隔 这就是我到目前为止所做的: IMPLICIT NONE REAL,ALLOCATABLE,DIMENSION(2) :: data(:,:) INTEGER :: row,column INTEGER :: j,i CHARACTER(len=30) :: filename CHARACTER(len=30) :

我想从一个txt文件中读取和存储科学格式的数字,该文件是格式化的,数字由制表器分隔

这就是我到目前为止所做的:

IMPLICIT NONE

REAL,ALLOCATABLE,DIMENSION(2)    :: data(:,:)       
INTEGER              :: row,column
INTEGER              :: j,i
CHARACTER(len=30)        :: filename
CHARACTER(len=30)        :: format

filename='data.txt'
open(86,file=filename,err=10)
write(*,*)'open data file'   
read(86, *) row
read(86, *) column

allocate(data(row,column))

format='(ES14.7)'   

do i=1,row
  read(86,format) data(i,:)
enddo

close(86)
这是txt文件的外观:

200
35
2.9900E-35  2.8000E-35  2.6300E-35  2.4600E-35  2.3100E-35  2.1600E-35  ...
问题是它没有从txt中读取并存储正确的值到数据变量。是格式导致了问题吗


我还想知道在这种情况下如何计算列数。(我可以在for循环中使用read(86,*)来计算行数。)

是的,您的格式不适合显示的数据。更好的应该是这样的
read(99'(6(E11.4,X)))myData(i,:)

然而,我不确定你是否真的需要在阅读中使用格式

下面的示例非常接近您正在尝试做的事情,它可以使用bot格式,也可以不使用bot格式

program readdata
  implicit none
  real, allocatable :: myData(:,:)
  real              :: myLine
  integer           :: i, j, myRow, myColumn
  character(len=30) :: myFileName
  character(len=30) :: myFormat

  myFileName='data.dat'

  open(99, file=myFileName)
  write(*,*)'open data file'
  read(99, *) myRow
  read(99, *) myColumn

  allocate(myData(myRow,myColumn))

  do i=1,myRow
    read(99,*) myData(i,:)
    !read(99,'(6(E11.4,X))') myData(i,:)
    print*, myData(i,:)
  enddo

  close(99)

end program readdata
为了进行测试,我假设文件中始终有行和列,正如您所给出的,因此我的测试数据如下

2
6
2.9900E-35  2.8000E-35  2.6300E-35  2.4600E-35  2.3100E-35  2.1600E-35
2.9900E-35  2.8000E-35  2.6300E-35  2.4600E-35  2.3100E-35  2.1600E-35

如果您真的有兴趣使用某种格式读取文件,并且如果列数不是恒定的,您可能需要一种取决于变量的格式,请参阅相关讨论

虽然没有直接命令来计算一行中的项目数,但我们可以使用该命令来计算周期数或(E | E | D | D)。比如说,

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
请注意,模式(1)仅在所有项目都有句点时有效,而模式(2)仅在所有项目都有指数时有效:

# 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

出于更一般的目的,编写一个自定义的“split()”函数(或使用支持split函数的外部库)来分隔项目可能更方便。

可能会引起兴趣,因为格式反转可能很重要:格式从记录/行请求单个值。如果不是,那么您能准确地解释您看到的意外行为吗?似乎您确实知道列数
(35)
。澄清为什么要计算列数?我知道这个特定文件的列数,但我想处理几十个或数百个这样的数据文件。关键是不要检查每一个问题并手动设置。你是否尝试过用
双精度
real(8)
而不是
real
?现在你明白了为什么把两个问题放在一篇帖子里是不好的。你将得到只回答一部分的答案。每次发帖都要问一个问题。一个人怎么能接受一个我不知道。谢谢你的回答!我需要更新关于格式的知识:)谢谢你的子程序!以前没有使用过扫描,但似乎是最简单的解决方案。