我有一个13列41行的文件,其中包括41个不同组的Joback方法的系数。 但是,有些值不存在,并且该表将它们列出为“ X”。 我将表另存为.csv,然后在代码中将文件读取到数组中。 .csv的两行摘录(第二行包含不存在的系数)如下所示:

48.84,11.74,0.0169,0.0074,9.0,123.34,163.16,453.0,1124.0,-31.1,0.227,-0.00032,0.000000146
X,74.6,0.0255,-0.0099,X,23.61,X,797.0,X,X,X,X,X 

我尝试做的是读取并定义一个数组来保存每个IOSTAT值,这样我就可以知道是否读取了“ X”(即IOSTAT为正数):

DO I = 1, 41
        (READ(25,*,IOSTAT=ReadStatus(I,J)) JobackCoeff, J = 1, 13)
END DO

我发现问题是,如果要读取的行的第一个值为“ X”,产生一个正数的ReadStatus值,那么这些行的其余值将无法正确读取。

我的意图是,如果JobackCoeff(I,J)导致读取错误,则使用ReadStatus数组生成一条错误消息,从而查明“ X”。

出现读取错误后,我可以强制程序继续读取一行吗? 还是有更好的方法呢?

===============>>#1 票数:3 已采纳

一旦在输入执行过程中发生错误,则输入列表的处理将终止。 此外,输入列表中指定的所有变量都将变为未定义。 对第一个问题的简短回答是:不,在读取错误后无法继续读取一行。

然后,当需要更复杂的输入处理时,我们得到通常的答案:将行读入字符变量并进行处理。 我不会为您编写完整的代码(主要是因为尚不清楚确切需要什么),但是当您拥有字符变量时,您可能会发现index内在函数很有用。 有了它,您可以找到X s(通过重复调用子字符串以在一行中找到所有它们)。

或者,如果您提供显式格式(而不是依赖于列表定向( fmt=* )输入),则可以使用非高级输入(在read语句中为advance='no' )执行某些操作。 但是,一旦出现错误情况,文件的位置就会变得不确定:您还必须处理这个问题。 将行作为一个字符变量进行处理可能要简单得多。

下面给出了该概念的概述(没有声明,鲁棒性)。

read(iunit, '(A)') line
idx = 1    
do i=1, 13
  read(line(idx:), *, iostat=iostat) x(i)
  if (iostat.gt.0) then
    print '("Column ",I0," has an X")', i
    x(i) = -HUGE(0.)  ! Recall x(i) was left undefined
  end if
  idx = idx + INDEX(line(idx:), ',')
end do     

===============>>#2 票数:2

许多Fortran程序员和其他语言的程序员长期以来一直使用的替代方法是使用某种编辑器(我喜欢sed )并通过将所有X更改为NAN来修改文件。 您的编译器必须为此提供支持IEEE NaN (当前广泛使用的大多数作物都支持),它们将正确地将输入文件中的NAN解释为值为NaN的实数。

与已经接受(且非常好)的答案相比,此方法的好处是不需要Fortran中的巧妙编程即可解析包含混合条目的输入行。 使用编辑器进行字符串处理,使用Fortran读取数字。

  ask by Gabriel G translate from so

未解决问题?本站智能推荐:

2回复

Fortran OPEN(25,“ file.txt”,iostat = stat)中的语法错误

在Fortran(代码:块IDE)中执行以下代码时,编译时错误。 输出:
1回复

直接读取fortran中的特定行

我想读取文件的特定行,例如input.dat文件的第三行。 我现在的代码: 但是,代码将读取所有数据,直到到达第三行。 我们能读第三行吗? 我们可以读几行吗? 仅第二行和第四行。 在线可用示例也有类似的技巧。 我想知道现代的fortran版本中是否存在直接方法。 我
2回复

从数据文件中读取行

问题:在一行中读取包含多个条目的数据文件 我发现这样做的最简单方法是将整行读作字符串,然后使用内部读取来提取非空值。 ~~~~~~~~~~~~ 该解决方案的问题: 要求您知道数据文件中任何给定行的最大长度,这通常是不可能的。 要么 需要您创建一个任意且
2回复

使用Fortran 90在输入文件中正确读取注释行

据我了解,Fortran在从文件中读取数据时,假设它们是注释,那么它们将跳过以星号(*)开头的行。 好吧,我似乎用我创建的一个非常简单的程序来实现此行为时遇到了问题。 这是我简单的Fortran程序: 这是“ file.inp”: 我用 当我运行时,出现错误:
2回复

如何在Fortran中读取可能包含很长行的文本文件

例如,假设我有一个文本文件可能包含很长的文本行 我可以编写一个读取此文件的简单程序: 这仅支持文本文件,其中所有行不超过400个字符。 在C中,使用指针,类似的程序会自动支持任何文本文件。 如何以可以读取所有长度的行的方式重写示例程序?
5回复

Fortran:如何从文本文件的每一行中读取第一个字符?

这是我第一次尝试在Fortran中编程。 我正在尝试编写一个程序,该程序打印斐波那契数列的前1476个项,然后检查每个项的第一个数字,并存储数组中出现的1s,2s,3s,...,9s的数量。 我似乎无法弄清楚的问题是如何阅读每个术语的第一位数字。 我已经尝试了几件事,但是由于对Fort
2回复

逐行读取文本文件,但只读取特定列

我们如何逐行读取特定文件,同时跳过其中的某些列? 例如,我有一个文本文件,其中有数据,分为5列,但我只需要读取两列,它们可以是前两个或任何其他随机组合(我的意思是,需要一个可行的解决方案)与任何列的组合,如第一和第三列)。 代码是这样的 任何解释或示例都会有所帮助。
2回复

在Fortran中读取整数列表文件

我想使用Fortran程序读取数据文件,其中每一行都是整数列表。 每行都有可变数量的整数,由给定字符(空格,逗号...)分隔。 输入样例: 我有一个分割线的解决方案,我发现这很麻烦: 我的问题 : 在Fortran中,有没有更简单的方法可以做到这一点? 我
1回复

Fortran:从读取的文件分配内存

我尝试从文件中读取大量数据。 文件的结构是一致的,但是重复的次数却不一致。 输入文件的第一行告诉文件重复的次数。 我想分配许多与输入文件重复长度相同的向量。 有没有一种优雅的方法可以解决此问题,而无需分配每个变量? 我当前的子例程不起作用(我是Fortran新手)。 错误日
2回复

Fortran读取语句超出了行尾

你知道以下声明是否可以通过fortran 90/95/2003标准之一保证真实吗? “假设一个字符变量的read语句被赋予一个空行(即只包含空格和换行符号)。如果格式说明符是星号(*),它继续读取后续行,直到非空白如果格式说明符为'(A)',则将空字符串替换为字符变量。“ 例如,请查看以