Hy大家,我发现在一个简单的文件中读取未格式化的字符串时遇到了一些问题。当第一个/被发现时,一切都被遗漏了。
这是我想要阅读的文本示例:在修复的前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 '
从这里开始,一切都空白了!
我怎样才能克服这个阅读问题?
答案 0 :(得分:3)
问题是由于您使用列表导向输入(*作为格式)。列表导向输入对快速和脏输入很有用,但它有其局限性和怪癖。
你偶然发现了一个怪癖:输入中的斜杠(/
)终止了对READ语句的输入列表的值赋值。这正是您在上面描述的行为。
这不是编译器编写器的选择,而是由所有相关的Fortran标准强制执行。
解决方案是使用格式化输入。有几种选择:
如果您知道标签将始终位于相同的列中,则可以使用类似'(1X,A4,2X,A2,1X,A3,2X)'
的格式字符串(这不完整)来读取各个标签。这很容易出错,如果写出数据的程序因某种原因或其他原因改变了格式,或者手工编辑了实验室,也会很糟糕。
如果您可以控制编写标签的程序,则可以使用制表符分隔各个标签(以及后来的标签)。读入整行,使用INDEX
将其拆分为制表符分隔的子字符串,并使用(A)
格式读取各个字段。不要使用列表导向格式,否则您将受到上面提到的/
怪癖的攻击。这样做的好处是,您的标签还可以包含空格,并且可以非常轻松地从Excel导入数据。这就是我在这种情况下通常做的事情。
否则,您可以读取整行并拆分多个空格。比拆分单个制表符更复杂,但如果您无法控制数据源,它可能是最佳选择。那么你不能拥有包含空格的标签。