Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran-将未知字符转换为子字符串的字符串_Fortran_Fortran90 - Fatal编程技术网

Fortran-将未知字符转换为子字符串的字符串

Fortran-将未知字符转换为子字符串的字符串,fortran,fortran90,Fortran,Fortran90,我试图将输入字符串放入子字符串数组中。输入文件中的数据数少于10,但未知。每个数据之间的空格数量也不清楚 例如: Asd B Cwqe21 Ddsw Eww 我是Fortran的新手,所以我不知道应该使用哪种格式。我的问题是,我不知道数据的数量(这里我假设有5个),因此如何使代码工作? 我尝试了以下不起作用的方法: CHARACTER (LEN=100), DIMENSION(10) :: string READ (1,*) (string,I=1,10) 我得到的错

我试图将输入字符串放入子字符串数组中。输入文件中的数据数少于10,但未知。每个数据之间的空格数量也不清楚

例如:

Asd  B       Cwqe21 Ddsw      Eww
我是Fortran的新手,所以我不知道应该使用哪种格式。我的问题是,我不知道数据的数量(这里我假设有5个),因此如何使代码工作? 我尝试了以下不起作用的方法:

CHARACTER (LEN=100), DIMENSION(10) :: string
READ (1,*) (string,I=1,10)
我得到的错误似乎是因为没有第6个字符串可以读取并放入字符串(6)


我尝试使用“索引”来查找空格,但由于我不知道字符串中有多少空格,这对我没有帮助。

一种简单编程的低效方法是尝试读取最大数量的项目,如果这样做失败,则在读取成功之前尝试读取较少的项目,如下所示:

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' 

我不知道这是否比M.S.B评论中的标准方法更优雅/有效,但这是一个有趣的选择

  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

如对上一个问题的评论中所述,请使用格式
a
。另外,请看本页右侧的“相关”问题,其中第一个问题是不要再发布(几乎)相同的问题。相反,编辑您的问题以使其更清晰。将其读入一个字符串,格式为
(a)
。测试每个字符是否为空——如果为空,则有下一个子字符串的开头。使用index查找下一个空格以查找该子字符串的结尾,或者测试每个字符。将子字符串复制到字符数组中。重复……公平地说,这个版本更清晰——此时你应该删除另一个(下次修改问题而不是发布新的)有趣的解决方案——你应该展示从文件中读取所需的步骤。