File io Fortran:如何读取文本文件每行的第一个字符?
这是我第一次尝试用Fortran编程。我正试图编写一个程序,打印出的第一个1476项,然后检查每个项的第一个数字,并存储数组中出现的1、2、3、…、9的数量 我似乎弄不明白的问题是如何阅读每个术语的第一位数字。我尝试过几种方法,但由于我对Fortran技术的有限知识,我遇到了困难。我将这些术语写入一个文本文件,其思想是读取每行的第一位数字,并在数组中累加相应的数字。有人对如何做到这一点有什么建议吗 以下是我目前的代码: (编辑:我包括了读取文件的代码。现在它只打印出3.60772951994415996E-313, 这看起来像是某种地址,因为它不是斐波那契数。而且,它是唯一打印的东西,我希望它能打印出文件的每一行…) (edit-edit:考虑到这一点后,也许有一种方法可以将写入文本文件的内容格式化为仅第一位数字。有没有方法将实数的有效位数设置为1?:p)File io Fortran:如何读取文本文件每行的第一个字符?,file-io,fortran,File Io,Fortran,这是我第一次尝试用Fortran编程。我正试图编写一个程序,打印出的第一个1476项,然后检查每个项的第一个数字,并存储数组中出现的1、2、3、…、9的数量 我似乎弄不明白的问题是如何阅读每个术语的第一位数字。我尝试过几种方法,但由于我对Fortran技术的有限知识,我遇到了困难。我将这些术语写入一个文本文件,其思想是读取每行的第一位数字,并在数组中累加相应的数字。有人对如何做到这一点有什么建议吗 以下是我目前的代码: (编辑:我包括了读取文件的代码。现在它只打印出3.6077295199441
子例程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
啊。。。我刚读到你需要数组中存储的位数。而我只是数了数
哦,好吧。。。“留给读者一个练习……”:-)以下是一些提示:
- 以下是一个非Fortran语言的复杂提示:
楼层(10^(压裂(日志10(7214989861293412)))
(把这个放进去看看它能做什么。) - 一个更简单的提示(对于另一种方法)是,您可以做很多事情 用Fortran语言编写简单的 循环内的算术运算 构造——至少在解决方案的第一个过程中