Fortran95——从格式化文本文件中读取

标签 fortran

我需要从表中读取一些值。这些是前五行,让您了解它应该是什么样子:

1        +           3          98           96        1
2        +         337        2799         2463        1
3        +        2801        3733          933        1
4        +        3734        5020         1287        1
5        +        5234        5530          297        1

我感兴趣的是每行的前四列。我需要将它们读入数组。我使用了以下代码:

program ----
implicit none

integer, parameter :: totbases = 4639675, totgenes = 4395
integer :: codtot, ks
integer, dimension(totgenes) :: ngene, lend, rend
character :: genome*4639675, sign*4

open(1,file='e_coli_g_info')
open(2,file='e_coli_g_str')

do ks = 1, totgenes
 read(1,100) ngene(ks),sign(ks:ks),lend(ks), rend(ks)
end do
100 format(1x,i4,8x,a1, 2(5x,i7), 22x)



do ks = 1, 100
 write(*,*) ngene(ks), sign(ks:ks),lend(ks), rend(ks)
end do

end program

程序末尾的循环是打印前一百个条目以测试它们是否被正确读取。问题是我收到了这些垃圾(第四行是问题):

1 +           3   757934891
2 +         337   724249387
3 +        2801   757803819
4 +        3734   757803819
5 +        5234   757935405

显然,第四列已经偏离了。事实上,我在正在读取的文件中的任何位置都找不到这些值。我正在使用 Ubuntu 12.04 的 gfortran 编译器。如果有人能指出我正确的方向,我将不胜感激。我确信我可能遗漏了一些非常明显的东西,因为我是 Fortran 新手。

最佳答案

Fortran 格式是(传统上,有一些较新的东西,我不会在这里讨论)固定格式,也就是说,它们最适合具有固定列的文件格式。 IE。 N 列始终从字符位置 M 开始,没有 if 或 but。如果您的文件格式更类似于“自由格式”,即列由空格分隔,则使用列表格式读取数据通常会更容易且更可靠。也就是说,尝试将读取循环设置为


do ks = 1, totgenes
  read(1, *) ngene(ks), sign(ks:ks), lend(ks), rend(ks)
end do

此外,作为一般建议,打开您自己的文件时,从第 10 单元开始并从那里向上。 Fortran 实现通常使用一些低编号单元来表示标准输入、输出和错误(常见的选择是单元 1、5 和 6)。您可能不想重定向它们。

PS 2:我还没有尝试过你的代码,但似乎你的符号变量有边界溢出。它声明的长度为 4,但随后您分配给索引 ks,该索引一直到 totgenes。当您在 Ubuntu 12.04(即 gfortran 4.6)上使用 gfortran 时,在使用选项“-O1 -Wall -g -fcheck=all”进行开发编译时

关于Fortran95——从格式化文本文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825929/

相关文章:

visual-studio - 固定 Fortran 续行中无法识别的标记 '&'

gdb - 从 GDB 中的 Fortran 多态派生数据类型中打印值

c++ - 调用 ARPACK 反向通信矩阵 vector 例程

format - 从fortran中的txt文件读取数据

fortran - 在 Fortran 中用整数除以 double

fortran - 使用 fortran 覆盖文件

file-io - Fortran read 语句读取序列

python - 如何在 Fortran 派生类型或类中实现类型绑定(bind)写入语句输出

c++ - 使用 Fortran 中的内存数据调用 C 代码

pointers - 64 位 gcc 代码中的 32 位指针溢出 - 编译失败