Reading a character string of unknown length

后端 未结 4 2061
轻奢々
轻奢々 2021-02-02 00:07

I have been tasked with writing a Fortran 95 program that will read character input from a file, and then (to start with) simply spit it back out again. The tricky part is that

4条回答
  •  鱼传尺愫
    2021-02-02 00:50

    I have used the following. Let me know if it is better or worse than yours.

    !::::::::::::::::::::: SUBROUTINE OR FUNCTION :::::::::::::::::::::::::::::::::::::::                                                                                                                                   
    !__________________ SUBROUTINE lineread(filno,cargout,ios) __________________________                                                                                                                                   
    subroutine lineread(filno,cargout,ios)                                                                                                                                                                                  
    Use reallocate,ErrorMsg,SumStr1,ChCount                                                                                                                                                                                 
    ! this subroutine reads                                                                                                                                                                                                 
    ! 1. following row in a file except a blank line or the line begins with a !#*                                                                                                                                          
    ! 2. the part of the string until first !#*-sign is found or to end of string                                                                                                                                           
    !                                                                                                                                                                                                                       
    ! input Arguments:                                                                                                                                                                                                      
    ! filno (integer)             input file number                                                                                                                                                                         
    !                                                                                                                                                                                                                       
    ! output Arguments:                                                                                                                                                                                                     
    ! cargout (character)     output chArActer string, converted so that all unecessay spaces/tabs/control characters removed.                                                                                              
    
    implicit none                                                                                                                                                                                                           
    integer,intent(in)::filno                                                                                                                                                                                               
    character*(*),intent(out)::cargout                                                                                                                                                                                      
    integer,intent(out)::ios                                                                                                                                                                                                
    integer::nlen=0,i,ip,ich,isp,nsp,size                                                                                                                                                                                   
    character*11,parameter::sep='=,;()[]{}*~'                                                                                                                                                                               
    character::ch,temp*100                                                                                                                                                                                                  
    character,pointer::crad(:)                                                                                                                                                                                              
    
    nullify(crad)                                                                                                                                                                                                           
    cargout=''; nlen=0; isp=0; nsp=0; ich=-1; ios=0                                                                                                                                                                         
    Do While(ios/=-1) !The eof() isn't standard Fortran.                                                                                                                                                                    
    READ(filno,"(A)",ADVANCE='NO',SIZE=size,iostat=ios,ERR=9,END=9)ch ! start reading file                                                                                                                                  
    ! read(filno,*,iostat=ios,err=9)ch;                                                                                                                                                                                     
        if(size>0.and.ios>=0)then                                                                                                                                                                                           
         ich=iachar(ch)                                                                                                                                                                                                     
        else                                                                                                                                                                                                                
         READ(filno,"(A)",ADVANCE='no',SIZE=size,iostat=ios,EOR=9); if(nlen>0)exit                                                                                                                                          
        end if                                                                                                                                                                                                              
        if(ich<=32)then        ! tab(9) or space(32) character                                                                                                                                                              
            if(nlen>0)then                                                                                                                                                                                                  
         if(isp==2)then                                                                                                                                                                                                       
            isp=0;                                                                                                                                                                                                            
         else                                                                                                                                                                                                                 
            isp=1;                                                                                                                                                                                                            
         end if                                                                                                                                                                                                               
    eend if; cycle;                                                                                                                                                                                                         
        elseif(ich==33.or.ich==35.or.ich==38)then !if char is comment !# or continue sign &                                                                                                                                 
         READ(filno,"(A)",ADVANCE='yes',SIZE=size,iostat=ios,EOR=9)ch; if(nlen>0.and.ich/=38)exit;                                                                                                                          
        else                                                                                                                                                                                                                
         ip=scan(ch,sep);                                                                                                                                                                                                   
         if(isp==1.and.ip==0)then; nlen=nlen+1; crad=>reallocate(crad,nlen); nsp=nsp+1; endif                                                                                                                               
         nlen=nlen+1; crad=>reallocate(crad,nlen); crad(nlen)=ch;                                                                                                                                                           
         isp=0; if(ip==1)isp=2;                                                                                                                                                                                             
        end if                                                                                                                                                                                                              
    end do                                                                                                                                                                                                                  
    9 if(size*ios>0)call ErrorMsg('Met error in reading file in [lineread]',-1)                                                                                                                                             
    ! ios<0: Indicating an end-of-file or end-of-record condition occurred.                                                                                                                                                 
    if(nlen==0)return                                                                                                                                                                                                       
    !write(6,'(a,l)')SumStr1(crad),eof(filno)                                                                                                                                                                               
    !do i=1,nlen-1; write(6,'(a,$)')crad(i:i); end do; if(nlen>0)write(6,'(a)')crad(i:i)                                                                                                                                    
     cargout=SumStr1(crad)                                                                                                                                                                                                  
     nsp=nsp+1; i=ChCount(SumStr1(crad),' ',',')+1;                                                                                                                                                                         
    if(len(cargout)=0)then                                                                                                                                                                                         
    ! call ErrorMsg(SumStr1(crad)// " has unrecognizable data number!",-1)                                                                                                                                                  
    end if                                                                                                                                                                                                                  
    end subroutine lineread                                                                                                                                                                                                 
    

提交回复
热议问题