我有一个文件,每个元素都有压力值。我需要元素编号(ELNO)和压力(PLOAD)并通过子程序。我无法从文件中单独阅读它们。从S175开始,数据将如下所示。
我想能够读取这个文件,比如说A0001.txt,然后逐个读取这些行。当读取行时,我想将第一个点之后的数字,例如1007,1008等存储到变量ELNO中,以及循环中变量PLOAD中最后一个逗号之后的数字。这是因为我将需要ELNO的每个值并使用IF循环检查条件。
我的问题是读取文件并存储在像ELNO(i)之类的变量中。名称S175是不变的。
我想我理解逻辑。我必须将每个像字符串一样存储起来,然后从字符串中的第6个位置开始迭代,直到找到第一个“,”并将其存储在ELNO(i)中。但我是FORTRAN的新手而无法得到它。过去一周我一直在努力学习FORTRAN来做到这一点。但是,不能解决这个问题。
我尝试了下面这样的代码,但它不是逐行读取的,因为我没有把它放在一个循环中我猜。
S175.1007,P,0.221948
S175.1008,P,0.221943
S175.1009,P,0.221929
S175.1010,P,0.222287
S175.1018,P,0.222438
S175.1019,P,0.222425
.....
.....
.....
.....
.....
S175.13000,P,-1990
S175.13001,P,-1980
S175.13002,P,-2009
PROGRAM BARGE
implicit none
CHARACTER X*80
OPEN(UNIT=60, FILE="A0001.txt", ACCESS='SEQUENTIAL', ACTION='READ')
READ(UNIT=60, FMT='(A)', END=10)X
10 OPEN(UNIT=61, FILE="2.txt", ACTION="write")
WRITE (UNIT=61,FMT='(A)')X
END PROGRAM BARGE
使用Fortran的列表导向输入来读取S175.1019,P,0.222425
等行中的数据项会很容易。以下代码片段可以替换OP自己的答案中的do
循环:
DO
READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS) PRES
IF (SUCCESS.NE.0) EXIT
READ(PRES(6:),*) ELNO, P, PLOAD
WRITE(*,*) ELNO, PLOAD
END DO
要做到这一点,你必须包括一个声明,如
CHARACTER(LEN=1) :: P
在输入文件的每一行中捕获字母P
。重要的是这一行
READ(PRES(6:),*) ELNO, P, PLOAD
它使用编辑描述符*
,它告诉编译器/运行时如何从行PRES
中的第6个和后续字符中找出如何读取三个变量(一个整数,一个字符,一个实数)的值。
幸运的是,使用一个很好的干净输入文件,如显示的编译器读取值没有问题,所有扫描,
的出现是不必要的。如果,对于另一个应用程序,您需要在行中搜索字符的出现次数,请使用内部函数index
。
谢谢大家。我自己完成了。可能有一个更简单,更快速的方法,但这很好。如果有更有效的方法,请告诉我。我可以学习。 :)
PROGRAM BARGE
implicit none
CHARACTER PRES*80
INTEGER :: SUCCESS
INTEGER :: K, L, M, ELNO ! K is for the element number,L is word P and M is for pressure value
REAL :: PLOAD
OPEN(UNIT=60, FILE="1.txt", ACCESS='SEQUENTIAL', ACTION='READ')
DO
READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS)PRES
IF (SUCCESS.NE.0) EXIT
K=6
DO WHILE (PRES(K:K) .NE. ',')
K=K+1
END DO
READ(PRES(6:K-1), *) ELNO
PRINT *, ELNO ! ELEMENT NUMBER
L=K+1
DO WHILE (PRES(L:L) .NE. ',')
L=L+1
END DO
M=L+1
DO WHILE (PRES(M:M) .NE. ' ')
M=M+1
END DO
READ(PRES(L+1:M-1), *) PLOAD ! PRESSURE ON THE ELEMENT
PRINT *, PLOAD
OPEN(UNIT=61, FILE="2.txt", ACTION="write")
WRITE (UNIT=61,FMT='(A)')PRES
END DO
READ (*,*) PRES
END PROGRAM BARGE