回 帖 发 新 帖 刷新版面

主题:字符串与数值型的问题

如果我有一个字符串,‘1990   189   123’
我想在不指定第几个字符的情况下,让它转换成3个整型值,应该怎么做?求教,谢谢

回复列表 (共9个回复)

沙发

那就需要程序能判断空格的位置。我的想法是:

首先利用f90的字符内部函数scan()判断空格的位置,把这个字符串分解为子字符串,
subroutine decomposeChar(origChar, separater, number, decomposedChar)
  implicit none
  character(len=*), intent(in)  :: origChar
  character(len=1), intent(in) :: separater
  character(len=*), intent(out) :: decomposedChar
  integer, intent(in)  :: number

  character(len=len(origChar)) :: origCharCopy
  integer :: loc, i

  origCharCopy=origChar
! 这里的代码去除字符串开头的separater
  do i=1, len(origCharCopy)
     if (origCharCopy(1:1) == separater) then
            origCharCopy = origCharCopy(2:len(origCharCopy))
     else
        exit
     endif              
  enddo
! 用挤牙膏的方式,一个一个地把字符串挤出来
  do i=1,number
     loc = scan(origCharCopy, separater)
     if (loc == 0) then
        decomposedChar = trim(origCharCopy)
     else
        decomposedChar = origcharCopy(1:loc-1)
!       print *, trim(decomposedChar)
        origCharCopy = origCharCopy(loc+1: len(origCharCopy))
     endif
  enddo
end subroutine



然后,将这些子字符串转换为整型。字符串是可以作为fortran内部文件的,用read语句即可读到整型变量中。

character(len=128) :: char='123'
integer :: x
read (unit=char, fmt='(i8)') x

板凳

谢谢了,不过有点儿麻烦啊。。。我试试吧

3 楼

PROGRAM MAIN
      IMPLICIT NONE
      CHARACTER*32 A
      INTEGER B,C,D

      A='1990    189   123'
      READ(A,*)B,C,D
      WRITE(*,*)B
      WRITE(*,*)C
      WRITE(*,*)D
      END

4 楼

我觉得上面那个是~稍微~有点麻烦

5 楼

ls的朋友,那假如我文件里有一行是‘1990 123 1324’这样的东西,我想要把它们读成一整个字符串可以吗?因为我现在的这个文件每一行的东西不同,但是开头的都是数字,如果开头的是1990我就把它放到一个文件里面,如果不是我就放进另一个文件里面

6 楼

read(fid,'(A512)')LineBuff
LineBuff长度要大于512。
然后可以:
Read(LineBuff,*)NYear
If (NYEAR.EQ.1990) Then
....
End If

7 楼

3 楼 academician 网友的基本想法正确,下面是我随手的程序:

subroutine ReadString
  implicit none
    
  integer:: i, j, k 
  character(len = 100):: str
  integer:: IU
  
  open (unit = 15, file = "In05.dat")
  open (unit = 21, file = "Data1990.dat") 
  open (unit = 22, file = "Data1234.dat")
    
  do while ( .true. )
    read(unit = 15, fmt = *, end = 20) str
    read(str, fmt = *) i, j, k
    if ( i == 1990 ) then
      IU = 21
    else 
      IU = 22
    end if
    write(unit = IU, fmt = *) i, j, k
    write(unit = *, fmt = *) i, j, k
  end do    

20 close(15)
  
  return      
end subroutine

输入文件:
'1990   189   123'
'1990   18923   123'
'1990   189   1234567890'
'1990   123489   123456789'
'1990   1894567   123457890'
'1991 1895637 127890'
'1991 1795637 127893'

不过,我觉得您这些字符串还有更简单的办法,先在文本文档中把 替换 ' '  和  " "
成空格,这样就可以直接读取数据了。
一句话,怎么样简单 就 怎样处理。

8 楼

注册表中性能计数器名称字符串数值的格式不正确。不正确的字符串是2278,不正确的索引值是数据节中的第一个DWORD值,最后的有效索引值是数据节中的第二个和第三个DWORD值。有关更多信息,请参阅在的帮助和支持中心。如何修复?什么原因引起的重要?

9 楼

注册表中性能计数器名称字符串数值的格式不正确。不正确的字符串是2278,不正确的索引值是数据节中的第一个DWORD值,最后的有效索引值是数据节中的第二个和第三个DWORD值。有关更多信息,请参阅在的帮助和支持中心。如何修复?什么原因引起的重要?

我来回复

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