чтение входного файла в фортране

Я ищу чтение файла, например:

NE                32         0
IBZINT             2
NKTAB            936
XC-POT    VWN       
ITER          29
MIX     2.00000000000000E-01
TOL     1.00000000000000E-05

Я думал, что я ищу index intrinsic, и соответственно писал код:

EDIT Код обновлен,

   Implicit None
    integer ::i,pos
    character(50) :: name
    character(len=16),dimension(100)::key,val
    key(1)="NE"
    open(12,file="FeRh/FeRh.pot_new",status="old")
    do i=1,100
      read(12,*)name
      if (name(1:2)==key(1))then
        write(*,*)"find NE"
        write(*,*)name(1:2)
        write(*,*)name(index("NE","")+21)
      endif
    end do
    close(12)
    !write(*,*)index(key(1),"")
    End Program  readpot

Я ожидаю, что в третьем выражении write будет 32. Должно быть, где-то что-то пошло не так. не могли бы вы помочь?


person BaRud    schedule 28.01.2014    source источник
comment
Каковы симптомы ужасно неправильного? Однако отсутствие reads, вероятно, не помогает.   -  person francescalus    schedule 28.01.2014
comment
Кажется, вам не хватает : в третьем письме. Это должно быть name(index("NE",""):21)?   -  person francescalus    schedule 28.01.2014


Ответы (2)


Когда вы хотите прочитать строку из файла, вы используете ввод по списку (* в качестве формата). Это не то, что вам нужно, так как во время выполнения будет ограниченный синтаксический анализ.

То есть read(12,*) name в первой записи приведет к "NE", дополненному большим количеством пробелов в переменной name, так как запись будет разделена на пробелы.

Поскольку вы хотите всю строку в name, используйте формат '(A)' в read.

Получив эту строку, вы можете выполнить дальнейший синтаксический анализ. Однако из того, что вы показываете, index, похоже, не помогает, особенно когда вы проверяете пустую подстроку. Вы знаете длину ключа (используя len_trim), поэтому, если у вас есть совпадение, вы знаете расположение первого разделителя.

person francescalus    schedule 28.01.2014

Если бы я хотел прочитать строку, такую ​​как

NE                32         0

Я бы написал такое заявление

read(12,*) name, int1, int2

и ожидать, что мой процессор установит name в NE, int1 в 32 и int2 в 0, если, то есть, я объявил int1 и int2 целыми числами.

Я озадачен тем, что вы, кажется, хотите прочитать строку текста, а затем проанализировать ее, игнорируя при этом преимущества направленного на список ввода. Если вы хотите преобразовать его во что-то другое, кроме символьной переменной и двух целых чисел, сообщите нам об этом.

person High Performance Mark    schedule 28.01.2014
comment
Я хочу прочитать все значения, NE 32 0 просто как минимальный пример, позже он мне понадобится для использования в основной программе. Как я могу его разобрать? - person BaRud; 28.01.2014
comment
Если вы хотите прочитать строку, содержащую короткую строку, за которой следуют два целых числа, разделенных пробелами, следуйте моему совету. Если вам нужно разобрать строку каким-то другим способом, объясните как. - person High Performance Mark; 28.01.2014
comment
проблема, я думаю, в том, что ему нужны самые прочитанные строки, которые по-разному отформатированы в зависимости от ключевого слова. Чтение всей строки в виде строки, а затем условное чтение (список) из строки - хороший способ. - person agentp; 01.02.2014