Прочитать строку, содержащую (большое) N реалов в массив в Фортране - PullRequest
0 голосов
/ 12 июля 2010

Я прочитал () за заголовком входного файла и прочитал значение L в пути.

Теперь я перехожу к строке из L ^ 2 последовательных вещественных чисел, которые мне нужно ввести в элементы размещаемого массива A (L, L).

Попытка

          character *100 :: buffer
          read (1,10) buffer
10      format(a(L*10))

результаты в

Error: Syntax error in FORMAT statement at (1)  
Error: FORMAT label 10 at (1) not defined

но я не уверен, как еще справиться с (чрезвычайно) переменным числом реалов.

Попытка:

    do i=1,L
    do j=i,L
        read (1,"(f10.7)") buffer
        read (buffer,*) A(i,j)
    enddo
    enddo

броски:

Fortran runtime error: Expected REAL for item 2 in formatted transfer, got CHARACTER
    (f10.7)

Я не могу просто прочитать (1, "(a1000)"), поскольку L в конечном итоге окажется огромным, так что мне действительно нужен способ разбора элементов один за другим.

Скажите, пожалуйста, есть ли способ?

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

После того, как вы обработали заголовок, возможно, выполнив «причудливые» вещи, прочитав его в строку и проанализировав строку, почему бы просто не просто прочитать числа из файла и пропустить символ «буфер»?

«read (unit, *) A» называется «IO, управляемый списком» - если вы хотите знать, что искать или искать - мне кажется, это хороший подход. Он очень гибкий - вам не нужно заботиться о точном выравнивании ваших чисел по столбцам. Если вы просто прочитаете в массив «A», элементы будут прочитаны в порядке элементов массива Fortran.

В Fortran 2003 вы можете использовать «*» в качестве спецификатора повтора формата переменной: read (unit, '(* (F10.7))'). Однако, не многие компиляторы поддерживают это пока. Это самое простое, что нужно сделать - просто использовать огромное значение, большее, чем вам когда-либо понадобится - чтение прекратится, когда в списке больше не будет элементов для чтения - повторному спецификатору разрешено превышать количество элементов читать.

0 голосов
/ 12 июля 2010

Ха-ха, похоже, это работает:

read (1,*) A
write (*,*) A

Кажется, стандарт знает, что он делает, даже если я не знаю.

0 голосов
/ 12 июля 2010

Это то, что вы искали?

http://www.tek -tips.com / viewthread.cfm? Qid = 1420862 & page = 1

Обновление:

http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html http://rainbow.ldgo.columbia.edu/data/fortranreaddata.html

Это выходит за рамки неформатированного чтения длины записи.Прошло много времени с тех пор, как мне пришлось связываться с Fortran I / O.Я почти уверен, что есть флаг OPEN или READ, который указывает, что он не должен переходить на следующую строку, а должен сохранять указатель файла на месте, чтобы следующий READ мог начинаться с него.Но я не могу вспомнить это от руки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...