回 帖 发 新 帖 刷新版面

主题:请教fortran2008以及其他高手

看了你在http://bbs.pfan.cn/post-378089.html的程序

!此程序是将数据文件(要求每一行的数据个数相同,且每行首的分隔不能为逗号
!分隔符逗号和空格不能连续混合使用,空格可以连续),数据文件是整数。
!原理是:用动态分配数组的大小使用,先获取行数,再获取列数。
!      Fortran2008 by 2011-11-09
implicit none
integer count1,count2,len,m,n,error
integer, allocatable :: a(:,:)
character(len=100) buffer
open(10,file="in.txt")
open(20,file="out.txt")
!**************************************************************************
!获取数组a(:,:)的行数
!**************************************************************************
count1=0
do while(1)
    read(10,*,iostat=error)  
    if(error/=0) exit        !读数据文件的每一行,如果读到文件结尾跳出。
    count1=count1+1            !记录数据文件的行数。
end do

!**************************************************************************
!获取数组a(:,:)的列数
!**************************************************************************
rewind(10)                    !将当前读取位置移到数据文件开头。
read(10,"(A100)") buffer    !读取文件的第一行以获取第一行数据有多少个列数。
len=len_trim(buffer)        !取字符串的长度,不包括行尾的空格。
do N=1,len
    if(buffer(N:N)==char(44)) buffer(N:N)=char(32)    !将用分隔符逗号替换成空格。
enddo
buffer=trim(buffer)            
len=len_trim(buffer)
do N=1,len
    if(buffer(N:N)/=char(32))then
        count2=1        
        do M=N+1,len
            if(buffer(M:M)==char(32).and.buffer(M-1:M-1)/=char(32)) count2=count2+1
        enddo
        exit
    endif
enddo
allocate(a(count1,count2))    !分配数组a(:,:)的大小。
buffer="(??I6)"                !设定动态的输出格式。
buffer(2:2)=char(count2/10+48)
buffer(3:3)=char(mod(count2,10)+48)
write(*,*)"数组大小为:",count1,count2
rewind(10)
read(10,*) (a(M,:),M=1,count1)
write(06,buffer)((a(M,N),N=1,count2),M=1,count1)
write(20,buffer)((a(M,N),N=1,count2),M=1,count1)
end

如果数据文件是整数不是整数
比如下面这样 数据

     1                 1                 1   
  1S                2P-               2P  

我想把每行分拆成字符数组
比如第一行分成a(1)='1' a(2)='1' a(3)='1'
    第二行分成b(1)='1S' b(2)='2P-' b(3)='2P'

怎么实现?! 编了一天没成功 需要高手帮助
   

回复列表 (共1个回复)

沙发

直接
read(buffer,*)a(1:3)
read(buffer,*)b(1:3)

我来回复

您尚未登录,请登录后再回复。点此登录或注册