Чтение строки, содержимое которой зависит от первого символа - PullRequest
0 голосов
/ 27 апреля 2010

В Фортране, какой практический способ читать:

 A 1. 2. 3.   

, если первый символ «А», но не читается:

 Z

отдыхать, если первый символ, например, "Z".

Если я попытаюсь прочитать строку в целом:

read(1,*)char, number1, number2, number3

тогда произойдет ошибка, если номера отсутствуют. Поэтому мне нужен способ прочитать «A», оставаясь на этой строке, и, в зависимости от «A» или «Z», если нужно, остальное.

Ответы [ 3 ]

1 голос
/ 28 января 2018

Вот хороший трюк, который вы можете не знать.Вы можете поместить символьную переменную в место, где номер единицы находится в операторе чтения.Вы будете читать из переменной, а не из файла.

Начните с объявления символьной переменной, достаточной для чтения самой длинной строкиПрочитайте всю строку в эту переменную.Из переменной прочитайте этот первый символ.Если это А, читайте в цифрах.Это будет выглядеть так:

character*130 :: MyLine

read(1,'(a130)') MyLine
read(MyLine,*) char
if (char == 'A') then
   read(MyLine,*) char, number1, number2, number3
endif
1 голос
/ 28 января 2018

Вы всегда можете прочитать флаг и использовать выражение в iolist, чтобы определить, хотите ли вы читать что-нибудь еще. az.f90:

program az
   implicit none
   real number1, number2, number3
   character azflag
   integer iunit
   integer i
   open(newunit=iunit,file='az.txt',status='old')
   do
      number1 = -1
      number2 = -1
      number3 = -1
      read(iunit,*,end=10) azflag, (number1,number2,number3 &
         ,i=1,merge(1,0,any(azflag==['A','a'])))
      if(any(azflag==['A','a'])) then
         write(*,*) 'numbers read!'
      else
         write(*,*) 'nothing read'
      end if
      write(*,*) number1, number2, number3
   end do
10 continue
end program az

az.txt:

 A 1. 2. 3.
 Z
 a 4. 5. 6.
 z

Выход:

 numbers read!
   1.000000       2.000000       3.000000
 nothing read
  -1.000000      -1.000000      -1.000000
 numbers read!
   4.000000       5.000000       6.000000
 nothing read
  -1.000000      -1.000000      -1.000000
0 голосов
/ 25 января 2011

Небольшое отклонение от того, что вы хотите, состоит в том, чтобы заменить первую букву числом читаемых чисел, например

3 1. 2. 3.
0
2 3.14 -1.

Тогда, если максимальное количество элементов, которое вы хотите прочитать в каждой строке, равно nmax, тогда объявите

integer::i,n
real(dimension=nmax)::number

и используйте

read(1,*) n, (number(i), i=1,n)

Если вы действительно хотите продолжать использовать буквы, вы можете взломать что-нибудь, используя iachar(), чтобы получить значение ASCII символа, преобразованное в число реалов для чтения.

...