Fortran 90:读取包含一些“的通用字符串”/&引用;人物
大家好,我在读取一个简单文件中的未格式化字符串时发现了一些问题。当第一个/被找到后,所有的东西都丢失了 这是我想读的文本示例:在固定的前18个字符块(从#Mod到Flow[kW])之后,有一个化学物种名称列表,它们是我正在编写的程序中的变量(在本例中为5)Fortran 90:读取包含一些“的通用字符串”/&引用;人物,fortran,intel-fortran,Fortran,Intel Fortran,大家好,我在读取一个简单文件中的未格式化字符串时发现了一些问题。当第一个/被找到后,所有的东西都丢失了 这是我想读的文本示例:在固定的前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]
#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)
从现在开始,一切都是空白的
我怎样才能克服这个阅读问题呢?这个问题是由于您使用了列表定向输入(格式为*)。列表定向输入对于快速和肮脏的输入很有用,但它有其局限性和怪癖 您偶然发现了一个怪癖:输入中的斜杠(
/
)终止了对READ语句的输入列表的赋值。这正是您上面描述的行为
这不是编译器编写器的选择,而是所有相关Fortran标准的强制要求
解决方案是使用格式化输入。有几个选项可供选择:
如果您知道标签将始终位于同一列中,则可以使用格式字符串(如”(1X、A4、2X、A2、1X、A3、2X)
(此操作不完整)来读取各个标签。这很容易出错,如果写出数据的程序出于某种原因更改了格式,或者如果标签是手工编辑的,这也很糟糕
如果可以控制写入标签的程序,则可以使用制表符分隔各个标签(以及以后的标签)。读取整行,使用索引将其拆分为制表符分隔的子字符串,并使用(A)
格式读取各个字段。不要使用列表导向格式,否则您将受到上述/
怪癖的影响。这样做的好处是,标签中还可以包含空格,而且数据可以很容易地从Excel导入/导入Excel。这是我在这种情况下通常做的事情
否则,您可以读取整行内容并在多个空格上拆分。这比在单个制表符上拆分要复杂一些,但如果您无法控制数据源,它可能是最好的选择。你不可能有包含空格的标签。可能不是真正的重复,但请看你为什么看到你所做的事情的答案。我不知道在无格式模式下阅读可能会有一些怪癖,现在我知道了!非常感谢。
chapp(8) = 'MF[kg '