我正在尝试获取一行数据,其中字符位置21:28是x值,字符位置29:36是y值。我想将这两组数字放在两个变量中并进行比较。然后,如果x <= y我不想将其写入新文件,则将其写入新文件。
下面是我的代码,但是很难学习fortran,因此缺少某些部分。
program open
implicit none
call getarg(1,"block2.gro")
open(12,file="output.gro",status ='new')
Line =0
x = (21:28) !from input file to be x variable
y= (29:36) !from input file to be y variable
row = !unsure if I need a variable to contain the row
Line=line +1
if (line .ne. 2) then
if x < y
write(12,*) row
line = line+1
else
line=line +1
end if
end program open
任何学习fortran的帮助或有用的地方,将不胜感激!
[在学习新语言时,您需要慢慢开始。我感觉到您正在尝试一次做太多事情。
这里只是一些不起作用的东西:
您正在使用implicit none
,这应该很好。但是您没有声明任何变量。您使用了几个变量(line
,x
,y
,row
),但是从不告诉编译器它们是什么类型。
getarg
是一个子程序,它returns命令行参数的内容。这意味着您需要传递character(len=<something>)
变量作为第二个参数,而不是常量。这将失败。
您永远不会真正打开输入文件或从中读取文件。
x = (21:28)
的语法无效,但是我想你知道。
我认为应该在某处有一个循环,但没有。
顺便说一句,您甚至没有告诉我们x
和y
是整数还是浮点值。
Fortran从文本文件中读取数字时实际上非常灵活。如果x和y是文本文件中唯一的数字,则只需执行read(<unit>, *) x, y
:
program read_block
implicit none
real :: x, y
integer :: ios
open(unit=101, file='block2.gro', action='read', status='old')
do
read(101, *, iostat=ios) x, y
if (ios /= 0) exit
print *, x, y
end do
close(101)
end program read_block
如果其中还有其他字符,则可能必须使用显式格式:
read(101, '(20X, 2F8.3)', iostat=ios) x, y
或者,如果仍然想要整行,则可以读取整行,然后从中提取x
和y
的值:
real :: x, y
character(len=100) :: row ! make sure that the length is sufficient to hold entire line
integer :: ios
...
read(101, '(A)', iostat=ios) row
if (ios /= 0) exit
read(row(21:28), *) x
read(row(29:36), *) y
...
我建议您尝试运行此代码,查看其作用,然后使用您的Google技能继续进行操作,并了解每行的作用以及执行的原因。