2014-06-08 41 views
-2

我正在尝试将输入字符串放入子字符串数组中。输入文件中的数据数量少于10个,但未知。每个数据之间的空格数目也不清楚。Fortran - 带有未知字符的字符串转换为子字符串

例子:

Asd B  Cwqe21 Ddsw  Eww 

我很新手的Fortran,所以我不知道我应该使用哪种格式。我的问题是,我不知道数据的数量(这里我假设有5个),那么我如何使代码工作? 我试过,没有工作的情况如下:

CHARACTER (LEN=100), DIMENSION(10) :: string 
READ (1,*) (string,I=1,10) 

看来,我得到的错误是因为没有6弦阅读并投入串(6)。

我尝试使用“索引”来查找空间,但因为我不知道字符串中有多少空格,所以没有帮助我。

+0

作为评论给您以前的问题http://stackoverflow.com/questions/24090384/unknown-number-of-data-set-in-fortran-input-file,使用的格式'一'。另外,请看本页右侧的“相关”问题,其中第一个是http://stackoverflow.com/questions/6319631/reading-a-string-with-spaces-in-fortran?rq=1 – ClickRick

+0

不要再次发布(几乎)相同的问题。相反,编辑你的问题,使其更清楚。 –

+0

用格式“(A)'将它读入一个字符串中。测试每个字符以查看它是否不是空白 - 如果是,则您有下一个子字符串的开头。使用索引来查找下一个空白以查找该子串的结尾,或者测试每个字符。将子字符串复制到字符数组中。重复... –

回答

2

我不知道这是否比MSB评论中的标准方法更优雅/更有效率,但却是一个有趣的选择。

integer istart,nw 
    character (len=100) line,wd,words(100) 
    open(1,file='t.dat') 
    read(1,'(a)')line 
    istart=1 
    nw=0 
    do while(len(trim(line(istart:))).gt.0) 
    read(line(istart:),*)wd 
    istart=istart+index(line(istart:),trim(wd))+len(trim(wd)) 
    nw=nw+1 
    words(nw)=trim(wd) 
    enddo    
    write(*,*)trim(line) 
    write(*,*)('/',trim(words(k)),k=1,nw),'/' 
    end 
1

低效的做法,是简单的程序尝试读取的最大项目数,如果失败依次尝试读取较少的一个项目,直到读操作成功,如下图所示:

program xread_strings 
integer, parameter :: nw = 10 
character (len=1000) :: text 
character (len=20) :: words(nw) 
integer    :: i,ierr,nread 
text = "Asd B  Cwqe21 Ddsw  Eww" 
nread = 0 
do i=nw,1,-1 
    read (text,*,iostat=ierr) words(:i) 
    if (ierr == 0) then 
     nread = i 
     exit 
    end if 
end do 
if (nread > 0) write (*,*) "read ",nread," words: ",("'"//trim(words(i)) // "' ",i=1,nread) 
end program xread_strings 
! g95 Output: 
! read 5 words: 'Asd' 'B' 'Cwqe21' 'Ddsw' 'Eww' 
+0

有趣的解决方案 - 你应该显示所需的步骤从文件中读取。 – agentp