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
File io Fortran:如何读取文本文件每行的第一个字符?_File Io_Fortran - Fatal编程技术网

File io Fortran:如何读取文本文件每行的第一个字符?

File io Fortran:如何读取文本文件每行的第一个字符?,file-io,fortran,File Io,Fortran,这是我第一次尝试用Fortran编程。我正试图编写一个程序,打印出的第一个1476项,然后检查每个项的第一个数字,并存储数组中出现的1、2、3、…、9的数量 我似乎弄不明白的问题是如何阅读每个术语的第一位数字。我尝试过几种方法,但由于我对Fortran技术的有限知识,我遇到了困难。我将这些术语写入一个文本文件,其思想是读取每行的第一位数字,并在数组中累加相应的数字。有人对如何做到这一点有什么建议吗 以下是我目前的代码: (编辑:我包括了读取文件的代码。现在它只打印出3.6077295199441

这是我第一次尝试用Fortran编程。我正试图编写一个程序,打印出的第一个1476项,然后检查每个项的第一个数字,并存储数组中出现的1、2、3、…、9的数量

我似乎弄不明白的问题是如何阅读每个术语的第一位数字。我尝试过几种方法,但由于我对Fortran技术的有限知识,我遇到了困难。我将这些术语写入一个文本文件,其思想是读取每行的第一位数字,并在数组中累加相应的数字。有人对如何做到这一点有什么建议吗

以下是我目前的代码:

编辑:我包括了读取文件的代码。现在它只打印出3.60772951994415996E-313, 这看起来像是某种地址,因为它不是斐波那契数。而且,它是唯一打印的东西,我希望它能打印出文件的每一行…)

edit-edit:考虑到这一点后,也许有一种方法可以将写入文本文件的内容格式化为仅第一位数字。有没有方法将实数的有效位数设置为1?:p)

子例程writeFib(n)
整数::i
real*8::上一个、当前、新FIB
prev=0
电流=1
i=1,n吗
newFib=上一个+当前
prev=当前
电流=newFib
写(7,*)新fib
结束
返回
结束子程序
子例程recordFirstDigits(a)
整数::openStat,inputStat
real*8::fibNum
打开(7,file=“fort.7”,iostat=openStat)
如果(openStat>0)停止“***无法打开文件***”
做
读取(7,*,iostat=inputStat)fibNum
打印*,fibNum
如果(inputStat>0)停止“***输入错误***”
如果(inputStat<0)退出!文件结束
结束
关闭(7)
结束子程序
程序测试
整数::k,a(9)
k=1476
调用writeFib(k)
呼叫记录第一位数字(a)
结束程序
你能用A1格式阅读吗?已经20年了,所以我不记得确切的语法了。

你能用格式(A1)阅读吗?已经20年了,所以我不记得确切的语法

我收到一个“行结束”运行时错误

您不显示
!此处要阅读的代码…
这使得猜测您做错了什么有点困难:-)

也许您需要一个循环来读取每一行,然后在没有更多行时跳出循环转到continue语句

大概是这样的:

   do
      read(7,*,end=10) fibNumber
   end do
   10 continue
最好还是看看

我收到一个“行结束”运行时错误

您不显示
!此处要阅读的代码…
这使得猜测您做错了什么有点困难:-)

也许您需要一个循环来读取每一行,然后在没有更多行时跳出循环转到continue语句

大概是这样的:

   do
      read(7,*,end=10) fibNumber
   end do
   10 continue

更好的是,看看。

我想知道为什么文件7还没有关闭,open语句就成功了。我认为在写和读之间需要一个endfile语句和/或rewind语句


Paul Tomblin发布了在首先解决了让读取工作的问题之后必须做的事情。

我想知道为什么在文件7未关闭的情况下open语句会成功。我认为在写和读之间需要一个endfile语句和/或rewind语句


保罗·汤姆布林(Paul Tomblin)发布了你在解决阅读问题后首先要做的事情。

虽然建议已经到位,但也有一些事情被遗忘了。实际类型的范围,以及一些格式问题

无论如何,这里有一个修补过的解决方案,已经编译并运行,所以试着看看它是否适合您。我冒昧地选择了自己的斐波那契数计算方法

  program SO1658805
  implicit none

  integer, parameter :: iwp = selected_real_kind(15,310)
  real(iwp) :: fi, fib
  integer :: i
  character(60) :: line
  character(1) :: digit
  integer :: n0=0, n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0

  open(unit=1, file='temp.txt', status='replace')
  rewind(1)
  !-------- calculating fibonacci numbers -------
  fi = (1+5**0.5)/2.
  do i=0,1477
    fib = (fi**i - (1-fi)**i)/5**0.5
    write(1,*)fib,i  
  end do
  !----------------------------------------------
  rewind(1)

  do i=0,1477
    read(1,'(a)')line
    line = adjustl(line)
    write(*,'(a)')line


    read(line,'(a1)')digit

     if(digit.eq.' ') n0=n0+1
     if(digit.eq.'1') n1=n1+1
     if(digit.eq.'2') n2=n2+1
     if(digit.eq.'3') n3=n3+1
     if(digit.eq.'4') n4=n4+1
     if(digit.eq.'5') n5=n5+1
     if(digit.eq.'6') n6=n6+1
     if(digit.eq.'7') n7=n7+1
     if(digit.eq.'8') n8=n8+1
     if(digit.eq.'9') n9=n9+1
  end do
  close(1)

  write(*,'("Total number of different digits")')
  write(*,'("Number of digits 0: ",i5)')n0
  write(*,'("Number of digits 1: ",i5)')n1
  write(*,'("Number of digits 2: ",i5)')n2
  write(*,'("Number of digits 3: ",i5)')n3
  write(*,'("Number of digits 4: ",i5)')n4
  write(*,'("Number of digits 5: ",i5)')n5
  write(*,'("Number of digits 6: ",i5)')n6
  write(*,'("Number of digits 7: ",i5)')n7
  write(*,'("Number of digits 8: ",i5)')n8
  write(*,'("Number of digits 9: ",i5)')n9

  read(*,*)

  end program SO1658805
啊。。。我刚读到你需要数组中存储的位数。而我只是数了数


哦,好吧。。。“留给读者作为练习……”:-)尽管建议已经到位,但也有一些东西被遗忘了。实际类型的范围,以及一些格式问题

无论如何,这里有一个修补过的解决方案,已经编译并运行,所以试着看看它是否适合您。我冒昧地选择了自己的斐波那契数计算方法

  program SO1658805
  implicit none

  integer, parameter :: iwp = selected_real_kind(15,310)
  real(iwp) :: fi, fib
  integer :: i
  character(60) :: line
  character(1) :: digit
  integer :: n0=0, n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0

  open(unit=1, file='temp.txt', status='replace')
  rewind(1)
  !-------- calculating fibonacci numbers -------
  fi = (1+5**0.5)/2.
  do i=0,1477
    fib = (fi**i - (1-fi)**i)/5**0.5
    write(1,*)fib,i  
  end do
  !----------------------------------------------
  rewind(1)

  do i=0,1477
    read(1,'(a)')line
    line = adjustl(line)
    write(*,'(a)')line


    read(line,'(a1)')digit

     if(digit.eq.' ') n0=n0+1
     if(digit.eq.'1') n1=n1+1
     if(digit.eq.'2') n2=n2+1
     if(digit.eq.'3') n3=n3+1
     if(digit.eq.'4') n4=n4+1
     if(digit.eq.'5') n5=n5+1
     if(digit.eq.'6') n6=n6+1
     if(digit.eq.'7') n7=n7+1
     if(digit.eq.'8') n8=n8+1
     if(digit.eq.'9') n9=n9+1
  end do
  close(1)

  write(*,'("Total number of different digits")')
  write(*,'("Number of digits 0: ",i5)')n0
  write(*,'("Number of digits 1: ",i5)')n1
  write(*,'("Number of digits 2: ",i5)')n2
  write(*,'("Number of digits 3: ",i5)')n3
  write(*,'("Number of digits 4: ",i5)')n4
  write(*,'("Number of digits 5: ",i5)')n5
  write(*,'("Number of digits 6: ",i5)')n6
  write(*,'("Number of digits 7: ",i5)')n7
  write(*,'("Number of digits 8: ",i5)')n8
  write(*,'("Number of digits 9: ",i5)')n9

  read(*,*)

  end program SO1658805
啊。。。我刚读到你需要数组中存储的位数。而我只是数了数

哦,好吧。。。“留给读者一个练习……”:-)

以下是一些提示:

  • 您不需要使用字符, 此问题的文件i/o要少得多 (除非你忘了说 必须创建文件)
  • 因此,使用数学来查找统计数据。有很多方法可以提供简化的见解,或者至少可以提供一种独立抽查答案的方法。
    • 以下是一个非Fortran语言的复杂提示:
      楼层(10^(压裂(日志10(7214989861293412)))

      (把这个放进去看看它能做什么。)
    • 一个更简单的提示(对于另一种方法)是,您可以做很多事情 用Fortran语言编写简单的 循环内的算术运算 构造——至少在解决方案的第一个过程中
  • 随着时间的推移积累统计数据 转到。这个建议甚至适用于你的角色驱动方法。(这个问题非常适合 谢谢你提出了一个可爱的建议 你的统计数据的方案,但有些 人们讨厌在公共场所搞些可爱的勾当 编程。如果你不怕的话 可爱…那么你就可以有联想了 Fortran中的数组与 键是整数;-)
  • 这其中最重要的方面 问题是您将使用的数据类型 使用计算您的答案。对于 例如
  • 干杯,-Jared这里有一些提示:

  • 您不需要使用字符, 更不用说文件了