Fortran 90:读取包含一些“/”字符的通用字符串

Fortran 90: reading a generic string with enclosed some "/" characters

大家好,我在读取一个简单文件中的未格式化字符串时发现了一些问题。当找到第一个 / 时,它后面的一切都被遗漏了。

这是我想阅读的文本示例:在固定的前 18 个字符块(从#Mod 到 Flow[kW])之后,有一个化学物种列表'名称,它们是我正在编写的程序中的变量(在本例中为 5)。

 #Mod  ID Mod  Name       Type C.  #Coll    MF[kg/s]    Pres.[Pa]    Pres.[bar]    Temp.[K]    Temp.[C]    Ent[kJ/kg K]    Power[kW]    RPM[rad/s]    Heat Flow[kW]     METHANE     ETHANE      PROPANE    NITROGEN    H2O       

我想跳过,经过一些正式检查后,前 18 个块,然后读取化学物质。为了做到前者,我创建了一个维度为 18 的字符数组,每个字符数组的长度为 20。

character(20), dimension(18)       :: chapp

然后我想把这18个块关联到字符数组

read(1,*) (chapp(i),i=1,18)

...但这是结果:从 chapp(1) 到 chapp(7) 保存了正确的前 7 个字符串,但这是 chapp(8)

chapp(8) = 'MF[kg               '

从现在开始,一切都留空!

我怎样才能克服这个阅读问题?

问题是由于您使用了列表定向输入(* 作为格式)。列表定向输入对于快速和脏输入很有用,但它有其局限性和怪癖。

您偶然发现了一个怪癖:输入中的斜杠 (/) 终止了对 READ 语句的输入列表的赋值。这正是您在上面描述的行为。

这不是编译器作者的选择,而是所有相关 Fortran 标准的强制要求。

解决方法是使用格式化输入。有几种选择:

如果您知道您的标签将始终位于同一列中,则可以使用 '(1X,A4,2X,A2,1X,A3,2X)' 之类的格式字符串(这不完整)来读入各个标签。这很容易出错,而且如果写出数据的程序由于某种原因更改格式,或者标签是手动编辑的,也会很糟糕。

如果您可以控制写入标签的程序,则可以使用制表符分隔各个标签(以及以后的标签)。读入整行,使用 INDEX 将其拆分为制表符分隔的子字符串,并使用 (A) 格式读入各个字段。不要使用列表导向格式,否则你会遇到上面提到的 / 怪癖。这样做的好处是您的标签还可以包含空格,并且可以很容易地导入数据 from/to Excel。这就是我通常在这种情况下所做的。

否则,您可以整行阅读并在多个空格处拆分。比在单个制表符上拆分要复杂一些,但如果您无法控制数据源,它可能是最佳选择。那么你不能有包含空格的标签。