File io Fortran read语句读取序列
假设我有一个文件,每行包含一个数组索引,后跟数组值File io Fortran read语句读取序列,file-io,fortran,gfortran,File Io,Fortran,Gfortran,假设我有一个文件,每行包含一个数组索引,后跟数组值 i array(i) 我可以通过简单的读取(单位=10,*)I,数组(I)来读取数据吗?Fortran是否总是先读取i,然后使用该i值分配数组(i)?某些读取规范或编译器标志会影响行为吗?数据传输语句 read(unit=10,*) i, array(i) 是合法的,其行为符合要求:首先从记录中读取i的值,然后该值用于识别第二次读取的数组array(i)的元素 这是Fortran规范的要求,例如(Fortran 2018,12.6.4.5
i array(i)
我可以通过简单的
读取(单位=10,*)I,数组(I)
来读取数据吗?Fortran是否总是先读取i
,然后使用该i
值分配数组(i)
?某些读取规范或编译器标志会影响行为吗?数据传输语句
read(unit=10,*) i, array(i)
是合法的,其行为符合要求:首先从记录中读取i
的值,然后该值用于识别第二次读取的数组array(i)
的元素
这是Fortran规范的要求,例如(Fortran 2018,12.6.4.5.1):
确定输入/输出列表项指定哪些实体所需的所有值都是在处理该项的开始时确定的
当然,尽管这个数据传输语句可能有效,但这并不意味着它在所有情况下都是可取的,但在最简单的情况下,您信任输入数据。特别是,在此read语句期间,不可能对边界进行任何检查。如果读取的i
值对应于无效的数组元素规范,则程序将中断。您可能希望对数组元素使用中间值,只是为了处理输入文件的潜在问题。我甚至想说,这样的代码暴露了一个很大的漏洞,但如果它是仅由作者使用的一次性代码,这并不重要。强烈建议使用用于边界检查的编译器标志。“在这个read语句期间,不可能对边界进行任何检查”-我不确定是否明白这一点,尤其是为什么不可能,这不是一个实现质量问题,而不是完全不可能的问题吗?或者你指的是程序员的“手动”检查?如果是这样的话,它是有意义的。是的,@IanBush,程序员的输入验证。编译器运行时通常的边界检查是可用的,但通常是“我注意到你的程序坏了,但我不会让你继续认为一切正常”。要检查边界,我只需要使用一个临时变量来存储数组元素:read(unit=10,*)I,temp
。然后错误检查边界,然后将数组元素分配给temp:array(i)=temp
。