Извлечение чисел из файла


Я делаю большинство моих программирования на C/C++ и Perl, но я в настоящее время изучения Фортрана. Я начал кодирования простая программа, то что приняли меня < 5 минут в Perl (см. эту ветку от Биостар). Проработав несколько часов над решением на языке Fortran 95 (учить себя, как я иду), я пришел к этому решению.

неявные никто

! Variable definitions
integer                 :: argc
integer                 :: num_digits
integer                 :: i, j
integer                 :: iocode
integer                 :: line_length
integer                 :: value
character ( len=256 )   :: infile
character ( len=16 )    :: int_format
character ( len=16 )    :: int_string
character ( len=2048 )  :: line

! Verify and parse command line arguments
argc = iargc()
if( argc < 1 ) then
  write(*, '(A, I0, A)') "Error: please provide file name (argc=", argc, ")"
  stop
endif
call getarg(1, infile)

! Open input file, croak if there is an issue
open( unit=1, file=infile, action='read', iostat=iocode )
if( iocode > 0 ) then
  write(*, '(A, A, A)') "Error: unable to open input file '", trim(infile), "'"
  stop
endif

! Process the file, print in CSV format
do while(1 == 1)
  ! Read the line, skip if it is empty
  100 read( unit=1, fmt='(A)', end=200 ) line
  line_length = len_trim(line)
  if( line_length == 0 ) then
    goto 100
  endif

  ! The first value in the line is a string
  ! Find string boundaries and print it out
  i = 0
  do while( line(i:i) == ' ' )
    i = i+1
  end do
  j = i
  do while( line(j:j) /= ' ' )
    j = j+1
  end do
  write(*, '(A)', advance="no") line(i:j-1)

  ! Now grab the rest of the integer values
  ! on the line, multiply them by 3, and print
  i = j
  j = 0
  do while( i < line_length)
    do while( line(i:i) == ' ' )
      i = i+1
    end do
    j = i
    do while( j < line_length .and. line(j:j) /= ' ' )
      j = j+1
    end do
    int_string = line(i:j-1)
    read(int_string, '(I)') value
    value = value*3
    write(*, '(A, I0)', advance="no") ",", value
    i = j
    j = 0
  end do

  print *
end do
200 close( 1 )

end program

Там много что мне не нравится, как я написал эту программу, но трудно отделить мою неопытность с новым синтаксисом с плохой практикой. Одна вещь, в частности, что мне не нравится мое использование этикетки и пресловутый оператор goto оператор. Меня интересуют любые отзывы бы то ни было, но я особенно заинтересован в более эффективные способы, чтобы справиться с управлением структура программы (без использования Гото заявление и конечных параметров в прочитать функции, если это возможно).

Компиляторы у меня есть доступ только поддерживают функции через f95.



727
12
задан 21 января 2011 в 08:01 Источник Поделиться
Комментарии