как читать в рваном массиве неизвестного размера в fortran? [Дубликат]

Это было в моем .htaccess

DirectoryIndex index.html index.htm

index.html, содержащем PHP-код. По умолчанию PHP не будет обрабатывать файлы с такими расширениями, как htm *, как PHP-код.

Вы можете переопределить это, добавив следующее в .htaccess:

<FilesMatch ".+\.html$">
    SetHandler application/x-httpd-php
</FilesMatch>
1
задан francescalus 29 January 2015 в 21:12
поделиться

4 ответа

Один метод: прочитайте строку в строке, используя строку, которая по крайней мере длиннее самой длинной ожидаемой строки. Затем вы начинаете разбирать строку. Например, если числа всегда разделяются пробелами, используйте это для определения границ подстроки. Затем вы можете использовать «внутренние чтения» для чтения из каждой подстроки для получения числовых значений. Внутреннее чтение использует строку вместо номера единицы и получает данные из строки - по крайней мере, вам не нужно воссоздавать преобразование символов в числовые значения, инструкция чтения сделает это за вас. Внутренние функции, предоставляемые Fortran, облегчат анализ.

7
ответ дан M. S. B. 21 August 2018 в 06:13
поделиться

Предполагая, что вы в порядке с заполнением массива нулями (в частности, ссылаясь на более поздний дублированный вопрос здесь ), это моя идея:

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

program unknown_numbers

    implicit none
    integer, parameter :: nrow=3, ncol=14
    integer :: data(ncol, nrow)
    character(len=2*ncol) :: zeros ! will contain lots of zeros
    character(len=10*ncol) :: line ! temporary storage for each line of the file
    integer :: i, u

    ! Write " 0 0 0 0 0 0 0 0" into the string "zeros"
    write(zeros, '(*(I2))') [(0, i=1, ncol)]

    open(newunit=u, file='data.txt', status='old', action='read')

    do i = 1, nrow, 1
        ! Read the next line into a temporary string array
        read(u, '(A)') line
        ! Append a number of zeros to the temporary string
        line = trim(line) // zeros
        ! Read the row of data from the string.
        read(line, *) data(:, i)
    end do

    close(u)

    ! For testing purposes, print the data.
    print '(14(X, I3))', data

end program unknown_numbers
2
ответ дан chw21 21 August 2018 в 06:13
поделиться
  • 1
    симпатичный пятно. Единственный недостаток здесь - вы не знаете, были ли фактические нули в файле или вашем дополнении. – agentp 5 April 2018 в 17:46
  • 2
    Ты прав. Я пришел сюда из более позднего вопроса , где заполнение нулями было желательным поведением, но которое было объявлено дубликатом этого вопроса. – chw21 5 April 2018 в 23:12
integer,parameter :: reclen=99999        ! maximum record length
integer,parameter :: undef=-9999         ! undefined value
integer :: actual_reclen                 ! actual record length
integer,dimension(reclen) :: dummy=undef ! dummy array used for reading
integer,dimension(:),allocatable :: a    ! final array

open(unit=10,file='sample.txt',form='formatted',access='sequential')
read(unit=10,fmt=*,end=101)(dummy(i),i=1,reclen)
101 close(unit=10)

actual_reclen=COUNT(dummy/=undef)
allocate(a(actual_reclen))
a=dummy(1:actual_reclen)

end
1
ответ дан milancurcic 21 August 2018 в 06:13
поделиться
  • 1
    Большое спасибо за ваш ответ, это будет читать все данные в файле, а не по строкам. Я использовал метод, предложенный MSB, и он отлично работает – Zahur 6 September 2011 в 10:58

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

program test12

implicit none

integer n,m,i

integer,allocatable::x(:)

 open(10,file='C:\Users\user\Desktop\file.txt')

allocate(x(n))

20 n=n+1

 deallocate(x) 



 allocate(x(n))

read(10,*,iostat=m)(x(i),i=1,n)

if (m==-1)then

goto 30

else


rewind 10

 goto 20

end if

 30 print*,n-1

 end
-3
ответ дан Vladimir F 21 August 2018 в 06:13
поделиться
  • 1
    это программа, которая может подсчитывать числа в строке (или количестве столбцов), но для строки. Если у вас много строк, вы должны слегка ее изменить – mja615 16 April 2017 в 08:08
  • 2
    Добро пожаловать, старайтесь всегда правильно отформатировать свои сообщения, а также прокомментировать, какие строки вы использовали в программе и почему они являются правильным решением. Также вы должны использовать последовательные отступы i ваши коды и избегать так много goto's. Goto считается вредным для многих. – Vladimir F 16 April 2017 в 09:18
  • 3
    вы действительно должны подумать, если вопрос принял принятый ответ 6 лет назад, что вы вносите? – agentp 16 April 2017 в 16:29
Другие вопросы по тегам:

Похожие вопросы: