Чтение данных из обновления файла данных в Fortran - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть вывод из кода в формате DAT.Файл имеет следующий формат

Text
Text
Text
Text
3241234234
234234
23423423
34123424
1324234
iteration pressure temperature density
1 1234 312 2.12
2 1235 321 2.15
3 1234 312 2.12
4 1235 321 2.15
5 1234 312 2.12
6 1235 321 2.15
pressure temperature density
7 1234 312 2.12
8 1235 321 2.15
9 1234 312 2.12
10 1235 321 2.15
11 1234 312 2.12
warning pressure update is not linked
12 1235 321 2.15
pressure temperature density
13 1234 312 2.12
14 1235 321 2.15
15 1234 312 2.12
warning pressure update is not linked
16 1235 321 2.15
17 1234 312 2.12
18 1235 321 2.15
end of iterations
simulation time
end loop
end of code

Я написал код, в котором я открываю файл данных.Прочитайте это как текст, используя iostat.Затем я пропускаю строку заголовка и случайные числа и т. Д. До строки итерации.Затем прочитайте числа (итерации давления, температуры, плотности).Но я застрял в нескольких местах, где мне нужна помощь.

  1. Начальные текстовые строки не постоянны.Иногда это 4 строки, а иногда пять или шесть.Каждый раз мне приходится корректировать количество строк и снова его компилировать.Есть ли способ автоматизировать это.Я имею в виду, что сам код будет считать текстовые строки и пропускать их.То же самое следующие случайные числа.

  2. Я хочу пропустить строки от начала до итерации.Но они тоже меняются.Читать только числовые данные

    1 1234 312 2.12 2 1235 321 2.15 3 1234 312 2.12 4 1235 321 2.15 5 1234 312 2.12 6 1235 321 2.15 7 1234 312 2.12 8 1235 321 2.15 9 ​​1234 312 2.12 10 1235 3212.15 11 1234 312 2.12 12 1235 321 2.15 13 1234 312 2.12 14 1235 321 2.15 15 1234 312 2.12 16 1235 321 2.15 17 1234 312 2.12 18 1235 321 2.15

и затем записать эти данныев качестве выходного файла.

1 Ответ

0 голосов
/ 19 февраля 2019

Следующий код делает то, что вы просили.Этот код предполагает, что данные хранятся в input.dat и распечатает вывод в output.dat .Логика довольно проста.Сначала строки читаются до тех пор, пока не будет обнаружена строка, начинающаяся с ключевого слова WORD_OF_INTEREST (здесь iteration ).Затем мы начинаем читать оставшиеся строки, предполагая, что в каждой строке 4 поля (т.е. итерация, плотность температуры давления).Строки, не подчиняющиеся этому шаблону, пропускаются.

Комментарии помогут вам понять алгоритм.

    program readData

       implicit none

       integer, parameter :: wp = selected_real_kind(15) ! double-precision floats
       integer, parameter :: ip = selected_int_kind(8) ! long integers

       character (len = *), parameter ::               &
          WORD_OF_INTEREST = 'iteration'      

       integer (kind = ip), parameter ::               & 
          LENGTH_WORD = len(WORD_OF_INTEREST),         &! calculate length of the word you are trying to find; that is, "iteration"
          NO_READING_ERROR = 0,                        &
          END_OF_FILE = -1

       integer (kind = ip) ::                          &
          handleFileInput,                             &
          handleFileOutput,                            &
          iteration,                                   &
          idError

       real (kind = wp) ::                             &
          pressure,                                    &
          temperature,                                 &
          density

       character (len = LENGTH_WORD) ::                & 
          line

    ! --------------------------------------------------------------------------------------------------
    ! --------------------------------------------------------------------------------------------------
    ! --------------------------------------------------------------------------------------------------
    ! Start executable section 
    ! --------------------------------------------------------------------------------------------------
    ! --------------------------------------------------------------------------------------------------
    ! --------------------------------------------------------------------------------------------------

       ! Open the input and output files
       open(newUnit = handleFileInput, file = 'input.dat')
       open(newUnit = handleFileOutput, file = 'output.dat')

       ! Read data file until a line starting with WORD_OF_INTEREST is encountered
       do

          read(handleFileInput, *) line
          if (line == WORD_OF_INTEREST) exit

       end do


       ! Read the rest of the file
       do

          read(handleFileInput, *, iostat = idError) iteration, pressure, temperature, density

          ! Handle different types of errors
          if (idError == NO_READING_ERROR) then

             write(handleFileOutput, *) iteration, pressure, temperature, density

          else if (idError == END_OF_FILE) then

             exit

          else

             continue 

          end if

       end do



       close(handleFileInput)
       close(handleFileOutput)

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