我需要从表中读取一些值。这些是前五行,让您了解它应该是什么样子:
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/