【问题标题】:Fortran runtime error: Bad real number in item 1 of list input:Error termination. Backtrace:Fortran 运行时错误:列表输入的第 1 项中的实数错误:错误终止。回溯:
【发布时间】:2021-03-17 05:09:02
【问题描述】:

这是 .dat 文件 2000 x 2000,我正在尝试在 fortran 中读取 .dat 文件,我是 fortran 的初学者,并尝试了所有不同的方式来读取文件。当我运行该文件时,它给了我 Fortran 运行时错误:Bad real number in item 1 of list input error。如果有人可以向我解释一下,这是怎么回事?

我也检查了,我要读取的文件在当前目录中。

我必须在编译器中打印这个 .dat 文件。 我的代码中是否有任何小错误? 这是前三行的数据,它的图像数据

1.1300000E+02 1.1300000E+02 1.1300000E+02 1.1300000E+02 1.1300000E+02 1.1300000E+02 1.1500000E+02 1.1500000E 02 1.1600000e+02 1.1600000e+02 1.1600000e+02 1.1600000e+02 1.1600000e+02 1.1600000e+02

这里有两种不同的方法,我尝试获取数据,(我尝试了更多方法,但没有奏效,显示我尝试显示我最近尝试的方法)

           program testpro
             implicit none
             !reads data from a file called mydata.dat
              real :: i,j
            open(unit=10,file='mydata.dat')
            read(10,*) i,j
            print *,i,j
            end program  testpro




         program Test2

         REAL :: mx,my,mz
         doubleprecision, allocatable, dimension(:,:,:) :: B
         integer :: i, j, k
         
         read (*,*) mx,my,mz             
         open(10,file='mydata.dat',status='old')

         read (10,*) mx,my,mz
         allocate (B(mx,my,mz) )

         read(10,*)(((B(i,j,k),i=1,mx),j=1,my),k=1,mz)
         close(10)
         end program Test2

【问题讨论】:

  • 文件的前 30 个字符是什么?是二进制文件还是ascii?文件mydata.dat 真的存在吗?
  • ascii 格式,数据中的几行看起来像这样 3.9200000e+04 3.9700000e+04 1.2400000e+04 6.6400000e+04
  • 我也尝试使用此代码 (stackoverflow.com/questions/28082794/…),并给出与此代码相同的错误。错误:Fortran 运行时错误:列表输入中第 1 项的整数错误。
  • 不要使用 cmets 获取重要信息。请edit您的问题并使用正确的格式。显示文本文件的确切形式。双重或三重检查文件是否确实位于应有的位置。如果没有,您的程序将改为创建一个空文件。
  • read (10,*) mx,my,mz 要求读取具有要读取的数组形状的头部。您需要在文件中提供此标头,或删除该读数。#

标签: fortran gfortran


【解决方案1】:

您的文件包含imax*jmax 值(imax 行和jmax 行)。因此,在每一行中,您必须读取从1jmaxj 值,并对从1imaxi 行重复此操作。要执行此类操作,您需要在数组中管理数据。我建议创建一个变量x,维度为(imax,jmax),并使用嵌套循环来读取。例如

PROGRAM TEST_read_from_file
IMPLICIT NONE
INTEGER          :: i, j
integer, parameter :: imax=10,jmax=5
REAL :: x(imax,jmax)

! create the test.dat file
Open (unit=1,file='./test.dat',status='unknown')
  do i=1,imax
    write (1,*) (rand(0),j=1,jmax)
  enddo
close(1)
! read the file test.dat
Open (unit=2,file='./test.dat',status='old')
  do i=1,imax
    read (2,*) (x(i,j),j=1,jmax)
  enddo
close(2)
! write x on the terminal
do i=1,imax
  write(*,*) (x(i,j),j=1,jmax)
enddo
END PROGRAM TEST_read_from_file

请注意,2000x2000 数组可能太大(4°000°000 值)

【讨论】:

  • 你确定吗,我想你的程序名称必须相同。不是必须是程序测试和结束程序测试吗?谢谢你的帮助,你的帮助,确实给了我一些输出,但是我想知道你为什么要创建文件,我们在这里所做的不就是读写吗?
  • @Beginner_Learner 是的,当然。我现在更正程序名称。我没有你要阅读的文件,所以我写了一些东西以便在我的文件夹中有一个文件
  • 它给了我同样的错误,Fortran 运行时错误:列表输入的第 1 项中的实数错误。你能解释一下我遇到的错误吗?
  • 您的文件包含诸如 1.1300000e+02 之类的实数而非整数值。当您尝试将这些实数放入声明为整数的变量中时。因此,文件包含的内容与您尝试放置变量的变量之间存在不匹配。在我给出的示例中,如果您将 x 声明为整数,您将收到相同的错误消息,即“Fortran 运行时错误:列表输入中第 1 项的错误整数”
  • 你知道你的文件包含什么。 2000x2000 的值是真实的。当您阅读文件时,您认为您正在阅读一个整数。当您打开文件时,您的第一个 cmd 会读取 mx、my 和 mz。这些变量被声明为整数。所以在这里你有一个不匹配。您还必须在某处关闭文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多