Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод таблицы 
:(
    Опции темы
W4FhLF
Дата 6.6.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Здравствуйте!

Когда дело касается форматированного ввода/вывода в фортране у меня наступает ступор. Вот и сейчас, нужно ввести данные такого формата:

Цитата

# Comment
# Comment
# Column1    Column2    Column3    Column4    Column5    Column6    Column7    Column8    Column9    Column10
    Str1  Str5  1  0  1  1  1.0+1.0i    1.0+1.0i    0+0i  1.0+1.0i    
    Str2  Str6  1  0  1  1  1.0+1.0i    1.0+1.0i    0+0i  1.0+1.0i    
    Str3  Str7  1  0  1  1  1.0+1.0i    1.0+1.0i    0+0i  1.0+1.0i    
# Comment
    Str4  Str8  1  3  3  1  1+1i  1+1i  0+0i  1+1i    
    Str5  Str9  2  3  3  1  1+1i  1+1i  0+0i  1+1i    


Т.е. это таблица. Первые два столбца строки, следующие пять целые числа, потом комплексные числа.
Есть комментарии, которые начинаются с заданного символа (# в данном случае).

Вопроса два:
1. Как прочитать отдельную строку?
2. Как её распарсить (типа аналог sprintf)?




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
FCM
Дата 6.6.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Если содержание первых двух столбцов каждой незакоментаренной символом # строки не нужно считывать, то для файла input.txt вида (имеющего одинаковую структуру для каждой незакоментаренной символом #  строки)
Код

#iiopp
    str1  str2  1  0  1  1  1.0+1.0i  1.0+1.0i
    str1  str2  2  0  2  2  2.0+2.0i  2.0+2.0i
#iiopp
    str1  str2  3  0  3  3  3.0+3.0i  3.0+3.0i


в рамках последовательного доступа можно попробовать поступить так:

Код

program hello                   ! MinGW-gfortran
    implicit none
    character :: ch
    integer(4), allocatable   :: IA(:,:)
    complex(8), allocatable   :: CA(:,:)
    integer :: st_eof=0, i, imax = 0, irec=0, j=0
    open( 11, file = 'input.txt', form = 'formatted', status = 'old', access = 'sequential' )
     ! Вспомогательный прогон, где определяем кол-во строк (irec)
     !  и кол-во незакоментаренных строк таблицы (imax)
    do
       read(11,*, iostat = st_eof ) ch
       irec = irec +1
       if( ch /= '#' ) imax = imax +1
       if(st_eof /=0)  exit  ! Выход из цикла, если достигнут конец файла
    enddo
    rewind(11)  ! Откатываемся на начало файла
    allocate( IA(imax,4), CA(imax,2) )    ! Размещаем массивы для целых и комплексных столбцов
    j=0
    do i = 1, irec
       read(11, '(a)' ) ch     ! Считываем символ - при этом переходим на след. запись (строку)
       if( ch /= '#' ) then
          j = j+1
          backspace(11)   ! Откатываем на начало предыдущей записи (строки)
          read(11,101) IA(j,:), CA(j,:)    ! Считываем числа
       endif
    enddo
    close(11)
101 format( 14x, 4(2x, i1), 2(2x, 2(f3.1, 1x)) )   ! Формат важная вещь в этой задаче
    ! Проверка
    do i =  1, imax
       write(*,101)  IA(i,:), CA(i,:)
    enddo
    deallocate(IA,CA)
end program


Результат проверки
Код

                1  0  1  1  1.0 1.0   1.0 1.0
                2  0  2  2  2.0 2.0   2.0 2.0
                3  0  3  3  3.0 3.0   3.0 3.0


В инструкции
101  format( 14x, 4(2x, i1), 2(2x, 2(f3.1, 1x)) ) 
формируется формат, где благодаря 'x' пропускаются ненужные символы.
Понятно, что формат программируется исходя из конкретного вида строки таблицы.

Выше 4 целочисленных столбца собраны в  2D массив размерами imax x 4, 2 комплексных столбца в 2D массив размерами imax x 2.
Можно сделать так, чтобы для каждого столбца был свой 1D массив.




Это сообщение отредактировал(а) FCM - 7.6.2011, 19:44
PM MAIL   Вверх
W4FhLF
Дата 6.6.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



FCM, спасибо за помощь. Допилил твой вариант. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.