我需要从一张桌子上读一些值。这是前五行,让您了解一下它应该是什么样子:
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程序末尾的循环是打印前100个条目,以测试它们是否被正确读取。问题是,我得到了这个垃圾(第四行是问题):
1 + 3 757934891
2 + 337 724249387
3 + 2801 757803819
4 + 3734 757803819
5 + 5234 757935405很明显,第四栏离我们很远。实际上,我在读取的文件中任何地方都找不到这些值。我正在为Ubuntu12.04使用gfortran编译器。如果有人能给我指明正确的方向,我将不胜感激。我相信我很可能错过了一些很明显的事情,因为我是新来的Fortran。
发布于 2013-07-24 06:07:56
Fortran格式是固定格式(传统上,有些更新的东西我不会在这里介绍),也就是说,它们最适合固定列的文件格式。例如,列N总是从字符位置M开始,没有ifs或但是。如果您的文件格式是“空闲格式”-like,即列由空格分隔,那么使用列表格式读取数据通常更容易,也更健壮。也就是说,尝试将您的读循环作为
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,但是你把它分配给索引k,它一直持续到整个基因。当您在Ubuntu12.04(即gfortran4.6)上使用gfortran时,在使用"-O1 -Wall -g -fcheck=all“选项进行编译时
https://stackoverflow.com/questions/17825929
复制相似问题