Fortran语言。继续阅读文档的第一个单词,直到它与输入匹配。

时间:2012-11-26 18:43:17

标签: loops if-statement while-loop fortran

晚上好! 我试图在Fortran 95中读取文本文档,并使用其中的值进行一些计算。该文件有许多气体名称和分配给它们的某些“A”值。所以基本上它看起来像这样:

Document 1: gas values.
GAS     A1  A2
steam    1  2
air      3  4

然后我希望用户输入气体名称(变量 gasNameIn )并实施while循环以继续搜索气体,直到它与输入匹配。所以,例如。用户输入' air ',程序开始读取第一个单词,直到空气出现。然后读取 A1 A2 的值并将其用于计算。我所做的是我将文件打开为第25单元并尝试以下循环:

do while(gasName .NE. gasNameIn)
  read(25, *) gasName
  if (gasName .EQ. gasNameIn)
    read(25,*) A1, A2
  endif
enddo

但是我收到错误“单元25上的文件结尾”。 关于我的while循环如何错误的任何想法?谢谢!

3 个答案:

答案 0 :(得分:0)

发生的事情是你将整行读作“gasName”并测试整行,看它是否等同于“gasNameIn”。如果数据按照样本中的方式布局,那么它将永远不会相同,因此在获得匹配之前,您将到达文件的末尾。我用Fortran写了一段时间,但在第一个循环中“gasName”将是未定义的。通常这是编程中的否定。

在我输入我的内容之前得到的答案是你的问题的前进方向。搏一搏。如果你还有一些麻烦,我可能会启动一个Fortran编译器并再次尝试使用Fortran。 (从90年代初开始,我就完成了任何事情。)

干杯!

嗨,这是你的代码修改了一下,你可以调整你不需要的东西。我刚刚添加了几行,使其成为一个独立的程序。例如,有一个语句将值“steam”赋值给“gasNameIn”。我想你提到过你会让用户输入一个值。我还添加了一个“写”语句来表明您的程序已正确读取值。这是一种粗暴的“单元测试”。否则,我只讨论了你的问题所涉及的程序部分。看看这个:

character (len=5) :: gasName, gasNameIn

gasNameIn = "steam"

open (unit = 25, file = "gasvalues.txt")

do while (gasName .NE. gasNameIn)
   read (25, *) gasName
   if (gasName .EQ. gasNameIn) then
   backspace (25)   
       read (25,*) gasName, A1, A2
       write (*, *) "The gas is: ", gasName, ". The factors are A1: ", A1, "; A2: ", A2
   endif
end do

close (25)

end

好的,这里有几个注释可以帮助澄清我所做的事情。我尽力保持你的代码完好无损。在你的程序中,我的fortran 95编译器抱怨的一些事情是:“if”测试中需要“then”,而“enddo”需要“end do”。我认为那些是我的主要编译器问题。

就您的代码而言,当您的程序测试“gasName”与“gasNameIn”相同时,您希望再次“备份”到该记录,以便您可以重新读取该行。可能有更好的方法来做到这一点,但我试图以你想要的方式保持你的程序想法。哦,是的,还有一件事,我已经将输入文件命名为“gasvalues.txt”。

我希望这会有所帮助。 干杯!

答案 1 :(得分:0)

通过第一个读取语句,您正确读取了名称,但Fortran然后进入下一行(记录)。尝试使用

  read(25, *, advance='no') gasName

如果搜索到的气体在最后一行,则会出现文件结束错误。否则,在阅读A1时会出错。

答案 2 :(得分:0)

你需要将整行读作字符串和进程。这是未经测试但是它的主旨:

character*100 wholeline
wholeline=''
do while(index(wholeline,'air').eq.0)
read(unit,'(a)')wholeline
end do

然后,如果你可以指望第一个字符串占用~7个cols,就像例子中那样,

read(wholeline(7:),*)ia1,ia2