Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Fortran。继续阅读文档的第一个单词,直到它与输入匹配为止。_Loops_If Statement_While Loop_Fortran - Fatal编程技术网

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

Loops Fortran。继续阅读文档的第一个单词,直到它与输入匹配为止。,loops,if-statement,while-loop,fortran,Loops,If Statement,While Loop,Fortran,晚上好! 我试图阅读Fortran 95中的文本文档,并用其中的值进行一些计算。文件中有许多气体名称和特定的“A”值。所以本质上看起来是这样的: Document 1: gas values. GAS A1 A2 steam 1 2 air 3 4 然后,我希望用户输入一个gas name变量gasNameIn,并实现while循环以继续搜索gas,直到它与输入匹配为止。例如,用户输入“air”,程序开始读取第一个单词,直到air出现。然后读取A1和A2的值,并使

晚上好! 我试图阅读Fortran 95中的文本文档,并用其中的值进行一些计算。文件中有许多气体名称和特定的“A”值。所以本质上看起来是这样的:

Document 1: gas values.
GAS     A1  A2
steam    1  2
air      3  4
然后,我希望用户输入一个gas name变量gasNameIn,并实现while循环以继续搜索gas,直到它与输入匹配为止。例如,用户输入“air”,程序开始读取第一个单词,直到air出现。然后读取A1和A2的值,并使用它们进行计算。我所做的是将文件作为第25单元打开,并尝试以下循环:

do while(gasName .NE. gasNameIn)
  read(25, *) gasName
  if (gasName .EQ. gasNameIn)
    read(25,*) A1, A2
  endif
enddo
但我在第25单元的文件结尾有个错误。
你知道我的while循环是怎么错的吗?谢谢大家!

所发生的事情是,您以gasName的形式读入整行代码,然后测试整行代码,看它是否与gasNameIn等效。如果数据按照您在样本中的方式排列,那么它将永远不会是相同的,因此您将在获得匹配之前到达文件的末尾。我已经有一段时间没有用Fortran编写了,但是在第一个循环中gasName将是未定义的。通常这是编程中的禁忌

我还没来得及把我的答案打进去,我就得到了答案,那就是解决你问题的方法。试试看。如果您仍然有一些问题,也许我会启动Fortran编译器,然后再次尝试Fortran。从90年代初开始,我就做过任何事情

干杯

您好,这里是您的代码修改了一点,您可以提出您不需要的。我只是添加了几行代码,使之成为一个独立的程序。例如,有一条语句将值steam分配给gasNameIn。我想你提到过,你会让用户为此输入一个值。我还添加了一个write语句,以表明您的程序已正确读取这些值。这是一种粗糙的单元测试。除此之外,我只讨论了你提问的项目部分。看看这个:

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

我希望这对你有所帮助。
干杯

通过第一条read语句,您可以正确地读取名称,但Fortran会继续执行下一行记录。尝试使用

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

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

您需要将整行作为字符串读取并处理。这是未经测试的,但其jist:

character*100 wholeline
wholeline=''
do while(index(wholeline,'air').eq.0)
read(unit,'(a)')wholeline
end do
然后,如果您可以计算第一个字符串占用~7列,如示例中所示

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

很抱歉,我似乎看不到另一个答案。你能给我一个简短的总结他在那里说的话吗?我刚刚在我的mac上安装了gfortran,所以再看看我编辑的答案,我希望它能有所帮助。请注意,在输入/输出语句中使用列表定向格式和高级说明符违反了语言限制。当然,我只是快速编辑了OP的行。换成a没问题。