1

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

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

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

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

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

4

3 回答 3

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”。

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

于 2012-11-26T18:58:17.543 回答
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
于 2012-11-27T05:21:38.117 回答
0

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

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

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

于 2012-11-27T00:11:02.190 回答