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。这就是我通常在这种情况下所做的。
否则,您可以整行阅读并在多个空格处拆分。比在单个制表符上拆分要复杂一些,但如果您无法控制数据源,它可能是最佳选择。那么你不能有包含空格的标签。
大家好,我在读取一个简单文件中的未格式化字符串时发现了一些问题。当找到第一个 / 时,它后面的一切都被遗漏了。
这是我想阅读的文本示例:在固定的前 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。这就是我通常在这种情况下所做的。
否则,您可以整行阅读并在多个空格处拆分。比在单个制表符上拆分要复杂一些,但如果您无法控制数据源,它可能是最佳选择。那么你不能有包含空格的标签。