2

我需要从表中读取一些值。这些是前五行,让您了解它的外观:

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 的新手。

4

1 回答 1

2

Fortran 格式是(传统上,有一些更新的东西,我不会在这里介绍)固定格式,也就是说,它们最适合具有固定列的文件格式。即第N 列总是从字符位置M 开始,没有ifs 或buts。如果您的文件格式更像“自由格式”,即列由空格分隔,则使用列表格式读取数据通常更容易且更健壮。也就是说,尝试将您的读取循环作为


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”开发编译时

于 2013-07-24T06:07:56.063 回答