- •Предисловие
- •1. Элементы языка
- •1.1. Свободная форма записи программы
- •1.2. Консоль-проект
- •1.2.1. Создание проекта в CVF
- •1.2.2. Создание проекта в FPS
- •1.2.3. Операции с проектом
- •1.2.4. Файлы с исходным текстом
- •1.3. Операторы
- •1.4. Объекты данных
- •1.5. Имена
- •1.6. Выражения и операции
- •1.7. Присваивание
- •1.8. Простой ввод/вывод
- •1.8.1. Некоторые правила ввода
- •1.8.2. Ввод из текстового файла
- •1.8.3. Вывод на принтер
- •1.9. Рекомендации по изучению Фортрана
- •1.10. Обработка программы
- •2. Элементы программирования
- •2.1. Алгоритм и программа
- •2.2. Базовые структуры алгоритмов
- •2.2.1. Блок операторов и конструкций
- •2.2.2. Ветвление
- •2.2.3. Цикл
- •2.2.3.1. Цикл "с параметром"
- •2.2.3.2. Циклы "пока" и "до"
- •2.2.4. Прерывание цикла. Объединение условий
- •2.3. Программирование "сверху вниз"
- •2.3.1. Использование функций
- •2.3.2. Использование подпрограмм
- •2.3.3. Использование модулей
- •2.4. Этапы проектирования программ
- •2.5. Правила записи исходного кода
- •3. Организация данных
- •3.1. Типы данных
- •3.2. Операторы объявления типов данных
- •3.2.1. Объявление данных целого типа
- •3.2.2. Объявление данных вещественного типа
- •3.2.3. Объявление данных комплексного типа
- •3.2.4. Объявление данных логического типа
- •3.3. Правила умолчания о типах данных
- •3.4. Изменение правил умолчания
- •3.5. Буквальные константы
- •3.5.1. Целые константы
- •3.5.2. Вещественные константы
- •3.5.3. Комплексные константы
- •3.5.4. Логические константы
- •3.5.5. Символьные константы
- •3.6. Задание именованных констант
- •3.7. Задание начальных значений переменных. Оператор DATA
- •3.8. Символьные данные
- •3.8.1. Объявление символьных данных
- •3.8.2. Применение звездочки для задания длины строки
- •3.8.3. Автоматические строки
- •3.8.4. Выделение подстроки
- •3.8.5. Символьные выражения. Операция конкатенации
- •3.8.6. Присваивание символьных данных
- •3.8.7. Символьные переменные как внутренние файлы
- •3.8.8. Встроенные функции обработки символьных данных
- •3.8.9. Выделение слов из строки текста
- •3.9. Производные типы данных
- •3.9.1. Объявление данных производного типа
- •3.9.2. Инициализация и присваивание записей
- •3.9.2.1. Конструктор производного типа
- •3.9.2.2. Присваивание значений компонентам записи
- •3.9.2.3. Задаваемые присваивания записей
- •3.9.3. Выражения производного типа
- •3.9.4. Запись как параметр процедуры
- •3.9.5. Запись как результат функции
- •3.9.6. Пример работы с данными производного типа
- •3.9.7. Структуры и записи
- •3.9.7.1. Объявление и присваивание значений
- •3.9.7.2. Создание объединений
- •3.9.8. Итоговые замечания
- •3.10. Целочисленные указатели
- •3.11. Ссылки и адресаты
- •3.11.1. Объявление ссылок и адресатов
- •3.11.2. Прикрепление ссылки к адресатам
- •3.11.3. Инициализация ссылки. Функция NULL
- •3.11.4. Явное открепление ссылки от адресата
- •3.11.5. Структуры со ссылками на себя
- •3.11.6. Ссылки как параметры процедур
- •3.11.7. Параметры с атрибутом TARGET
- •3.11.8. Ссылки как результат функции
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Массивы нулевого размера
- •4.3. Одновременное объявление объектов разной формы
- •4.4. Элементы массива
- •4.5. Сечение массива
- •4.6. Присваивание массивов
- •4.7. Маскирование присваивания
- •4.7.1. Оператор и конструкция WHERE
- •4.7.2. Оператор и конструкция FORALL
- •4.8. Динамические массивы
- •4.8.1. Атрибуты POINTER и ALLOCATABLE
- •4.8.2. Операторы ALLOCATE и DEALLOCATE
- •4.8.3. Автоматические массивы
- •4.9. Массивы - формальные параметры процедур
- •4.9.1. Массивы заданной формы
- •4.9.2. Массивы, перенимающие форму
- •4.9.3. Массивы, перенимающие размер
- •4.10. Использование массивов
- •4.11. Массив как результат функции
- •4.12. Встроенные функции для массивов
- •4.12.1. Вычисления в массиве
- •4.12.2. Умножение векторов и матриц
- •4.12.3. Справочные функции для массивов
- •4.12.3.1. Статус размещаемого массива
- •4.12.3.2. Граница, форма и размер массива
- •4.12.4. Функции преобразования массивов
- •4.12.4.1. Элементная функция MERGE слияния массивов
- •4.12.4.2. Упаковка и распаковка массивов
- •4.12.4.3. Переформирование массива
- •4.12.4.4. Построение массива из копий исходного массива
- •4.12.4.5. Функции сдвига массива
- •4.12.4.6. Транспонирование матрицы
- •4.13. Ввод/вывод массива под управлением списка
- •4.13.1. Ввод/вывод одномерного массива
- •4.13.2. Ввод/вывод двумерного массива
- •5. Выражения, операции и присваивание
- •5.1. Арифметические выражения
- •5.1.1. Выполнение арифметических операций
- •5.1.2. Целочисленное деление
- •5.1.3. Ранг и типы арифметических операндов
- •5.1.4. Ошибки округления
- •5.2. Выражения отношения и логические выражения
- •5.3. Задаваемые операции
- •5.4. Приоритет выполнения операций
- •5.5. Константные выражения
- •5.6. Описательные выражения
- •5.7. Присваивание
- •6. Встроенные процедуры
- •6.1. Виды встроенных процедур
- •6.2. Обращение с ключевыми словами
- •6.3. Родовые и специфические имена
- •6.4. Возвращаемое функцией значение
- •6.5. Элементные функции преобразования типов данных
- •6.6. Элементные числовые функции
- •6.7. Вычисление максимума и минимума
- •6.8. Математические элементные функции
- •6.8.1. Экспоненциальная, логарифмическая функции и квадратный корень
- •6.8.2. Тригонометрические функции
- •6.9. Функции для массивов
- •6.10. Справочные функции для любых типов
- •6.11. Числовые справочные и преобразовывающие функции
- •6.11.1. Модели данных целого и вещественного типа
- •6.11.2. Числовые справочные функции
- •6.12. Элементные функции получения данных о компонентах представления вещественных чисел
- •6.13. Преобразования для параметра разновидности
- •6.14. Процедуры для работы с битами
- •6.14.1. Справочная функция BIT_SIZE
- •6.14.2. Элементные функции для работы с битами
- •6.14.3. Элементная подпрограмма MVBITS
- •6.14.4. Пример использования битовых функций
- •6.15. Символьные функции
- •6.16. Процедуры для работы с памятью
- •6.17. Проверка состояния "конец файла"
- •6.18. Неэлементные подпрограммы даты и времени
- •6.19. Случайные числа
- •6.20. Встроенная подпрограмма CPU_TIME
- •7. Управляющие операторы и конструкции
- •7.1. Оператор GOTO безусловного перехода
- •7.2. Оператор и конструкции IF
- •7.2.1. Условный логический оператор IF
- •7.2.2. Конструкция IF THEN END IF
- •7.2.3. Конструкция IF THEN ELSE END IF
- •7.2.4. Конструкция IF THEN ELSE IF
- •7.3. Конструкция SELECT CASE
- •7.4. DO-циклы. Операторы EXIT и CYCLE
- •7.5. Возможные замены циклов
- •7.6. Оператор STOP
- •7.7. Оператор PAUSE
- •8. Программные единицы
- •8.1. Общие понятия
- •8.2. Использование программных единиц в проекте
- •8.3. Работа с проектом в среде DS
- •8.4. Главная программа
- •8.5. Внешние процедуры
- •8.6. Внутренние процедуры
- •8.7. Модули
- •8.8. Оператор USE
- •8.9. Атрибуты PUBLIC и PRIVATE
- •8.10. Операторы заголовка процедур
- •8.10.1. Общие характеристики операторов заголовка процедур
- •8.10.2. Результирующая переменная функции
- •8.11. Параметры процедур
- •8.11.1. Соответствие фактических и формальных параметров
- •8.11.2. Вид связи параметра
- •8.11.3. Явные и неявные интерфейсы
- •8.11.4. Ключевые и необязательные параметры
- •8.11.5. Ограничения на фактические параметры
- •8.11.6. Запрещенные побочные эффекты
- •8.12. Перегрузка и родовые интерфейсы
- •8.12.1. Перегрузка процедур
- •8.12.2. Перегрузка операций и присваивания
- •8.12.3. Общий вид оператора INTERFACE
- •8.13. Ассоциирование имен
- •8.14. Область видимости имен
- •8.15. Область видимости меток
- •8.16. Ассоциирование памяти
- •8.16.1. Типы ассоциируемой памяти
- •8.16.2. Оператор COMMON
- •8.16.3. Программная единица BLOCK DATA
- •8.17. Рекурсивные процедуры
- •8.18. Формальные процедуры
- •8.18.1. Атрибут EXTERNAL
- •8.18.2. Атрибут INTRINSIC
- •8.19. Оператор RETURN выхода из процедуры
- •8.20. Оператор ENTRY дополнительного входа в процедуру
- •8.21. Атрибут AUTOMATIC
- •8.22. Атрибут SAVE
- •8.23. Атрибут STATIC
- •8.24. Атрибут VOLATILE
- •8.25. Чистые процедуры
- •8.26. Элементные процедуры
- •8.27. Операторные функции
- •8.28. Строка INCLUDE
- •8.29. Порядок операторов и директив
- •9. Форматный ввод/вывод
- •9.1. Преобразование данных. Оператор FORMAT
- •9.2. Программирование спецификации формата
- •9.3. Выражения в дескрипторах преобразований
- •9.4. Задание формата в операторах ввода/вывода
- •9.5. Списки ввода/вывода
- •9.5.1. Элементы списков ввода/вывода
- •9.5.2. Циклические списки ввода/вывода
- •9.5.3. Пример организации вывода
- •9.6. Согласование списка ввода/вывода и спецификации формата. Коэффициент повторения. Реверсия формата
- •9.7. Дескрипторы данных
- •9.8. Дескрипторы управления
- •9.9. Управляемый списком ввод/вывод
- •9.9.1. Управляемый именованным списком ввод/вывод
- •9.9.1.1. Объявление именованного списка
- •9.9.1.2. NAMELIST-вывод
- •9.9.1.3. NAMELIST-ввод
- •9.9.2. Управляемый неименованным списком ввод/вывод
- •9.9.2.1. Управляемый неименованным списком ввод
- •9.9.2.2. Управляемый неименованным списком вывод
- •10. Файлы Фортрана
- •10.1. Внешние и внутренние файлы
- •10.2. Позиция файла
- •10.3. Устройство ввода/вывода
- •10.4. Внутренние файлы
- •10.5. Внешние файлы
- •10.6. Записи
- •10.6.1. Типы записей
- •10.6.2. Записи фиксированной длины
- •10.6.3. Записи переменной длины
- •10.6.4. Сегментированные записи
- •10.6.5. Потоки
- •10.6.6. CR-потоки
- •10.6.7. LF-потоки
- •10.7. Передача данных с продвижением и без
- •10.8. Позиция файла перед передачей данных
- •10.9. Позиция файла после передачи данных
- •10.10. Двоичные последовательные файлы
- •10.11. Неформатные последовательные файлы
- •10.12. Текстовые последовательные файлы
- •10.13. Файлы, подсоединенные для прямого доступа
- •10.14. Удаление записей из файла с прямым доступом
- •10.15. Выбор типа файла
- •11. Операции над внешними файлами
- •11.1. Оператор BACKSPACE
- •11.2. Оператор REWIND
- •11.3. Оператор ENDFILE
- •11.4. Оператор OPEN
- •11.5. Оператор CLOSE
- •11.6. Оператор READ
- •11.7. Оператор ACCEPT
- •11.8. Оператор FIND
- •11.9. Оператор DELETE
- •11.10. Оператор UNLOCK
- •11.11. Оператор WRITE
- •11.12. Оператор PRINT
- •11.13. Оператор REWRITE
- •11.14. Оператор INQUIRE
- •11.15. Функция EOF
- •11.16. Организация быстрого ввода/вывода
- •12.1. Некоторые сведения об объектах ActiveX
- •12.2. Для чего нужен конструктор модулей
- •12.3. Интерфейсы процедур управления Автоматизацией
- •12.4. Идентификация объекта
- •12.5. Примеры работы с данными Автоматизации
- •12.5.1. OLE-массивы
- •12.5.2. BSTR-строки
- •12.5.3. Варианты
- •12.6. Другие источники информации
- •12.7. Как воспользоваться объектом ActiveX
- •12.8. Применение конструктора модулей
- •12.9. Пример вызова процедур, сгенерированных конструктором модулей
- •Приложение 1. Вывод русского текста в DOS-окно
- •Приложение 2. Нерекомендуемые, устаревшие и исключенные свойства Фортрана
- •П.-2.1. Нерекомендуемые свойства Фортрана
- •П.-2.1.1. Фиксированная форма записи исходного кода
- •П.-2.1.2. Оператор EQUIVALENCE
- •П.-2.1.3. Оператор ENTRY
- •П.-2.1.4. Вычисляемый GOTO
- •П.-2.1.5. Положение оператора DATA
- •П.-2.2. Устаревшие свойства Фортрана, определенные стандартом 1990 г.
- •П.-2.2.1. Арифметический IF
- •П.-2.2.2. Оператор ASSIGN присваивания меток
- •П.-2.2.3. Назначаемый GOTO
- •П.-2.2.4. Варианты DO-цикла
- •П.-2.2.5. Переход на END IF
- •П.-2.2.6. Альтернативный возврат
- •П.-2.2.7. Дескриптор формата H
- •П.-2.3. Устаревшие свойства Фортрана, определенные стандартом 1995 г.
- •П.-2.4. Исключенные свойства Фортрана
- •Приложение 3. Дополнительные процедуры
- •П.-3.1. Запуск программ
- •П.-3.2. Управление программой
- •П.-3.3. Работа с системой, дисками и директориями
- •П.-3.4. Управление файлами
- •П.-3.5. Генерация случайных чисел
- •П.-3.6. Управление датой и временем
- •П.-3.7. Ввод с клавиатуры и генерация звука
- •П.-3.8. Обработка ошибок
- •П.-3.9. Аргументы в командной строке
- •П.-3.10. Сортировка и поиск в массиве
- •П.-3.11. Управление операциями с плавающей точкой
- •Литература
- •Предметный указатель
- •Оглавление
О. В. Бартеньев. Современный ФОРТРАН
write(4, '(e20.8)') 1.4e-6 |
! Длина записи 20 байт |
rewind(4) |
! Переход на начало файла |
read(4, '(Q)') recl |
! Читаем число байт в третьей записи |
print *, recl |
! 10 |
end |
|
Результат (состав файла a.txt):
123 555
Next record 0.14000000E-05
10.7. Передача данных с продвижением и без
Оператор В/В с продвижением всегда устанавливает файл после последней считанной или записанной записи (если не было ошибок).
Оператор В/В без продвижения, применяемый при форматной передаче данных и задаваемый спецификатором ADVANCE = 'NO' или (при выводе) дескрипторами \ и $, может устанавливать файл внутри текущей записи. Используя такой оператор, можно прочитать или записать одну запись с помощью нескольких операторов В/В, причем каждый из них будет обращаться к части записи, например:
character(6) :: st1, st2 |
|
open(1, file = 'a.txt') |
|
write(1, *) 'Test string' |
! Вывод с продвижением |
rewind 1 |
! Переход на начало файла |
read(1, '(a6)', advance = 'no') st1 |
! Ввод без продвижения |
print *, st1 |
! Test |
read(1, '(a6)', advance = 'no') st2 |
! Ввод второго слова в ту же запись |
print *, st2 |
! string |
10.8. Позиция файла перед передачей данных
Порядок установки позиции файла перед передачей данных зависит от способа доступа к файлу.
В случае последовательного доступа перед вводом, если есть текущая запись, позиция файла не меняется. Иначе файл устанавливается на начало следующей записи и она становится текущей. Ввод запрещен, если нет следующей записи или следующей является запись "конец записи". Такая ситуация в файле с последовательным доступом возникнет, когда последним обратившимся к нему оператором является оператор WRITE.
Перед выводом в файл с последовательным доступом, если есть текущая запись, то позиция файла не меняется и текущая запись становится последней записью файла. Иначе, например если файл находился перед записью "конец файла", создается новая запись, в которую будут передаваться данные и которая становится текущей и последней записью файла. Позиция файла устанавливается на начало этой записи.
336
10. Файлы Фортрана
При прямом доступе перед передачей данных позиция файла устанавливается в начало записи, определяемой спецификатором оператора В/В REC. Эта запись становится текущей.
10.9. Позиция файла после передачи данных
При вводе без продвижения, если не было ситуации ошибки или ситуации "конец файла", но есть ситуация "конец записи", позиция файла устанавливается после только что считанной записи. Если же в операторе ввода без продвижения не было ситуаций ошибки, "конец файла" или "конец записи", то позиция файла не меняется. В операторе вывода без продвижения, если не было ситуации ошибки, позиция файла не изменяется.
Во всех остальных случаях файл устанавливается вслед за последней считанной или записанной записью, так что она становится предшествующей записью.
10.10. Двоичные последовательные файлы
При работе с двоичными файлами обмен данными выполняется без их преобразования. При записи в двоичный файл в него фактически копируется содержимое ячеек оперативной памяти. При чтении, наоборот, последовательность байтов двоичного файла передается в ячейки оперативной памяти, отведенные под элементы ввода. В FPS число записей в двоичном файле равно числу переданных байт. Поэтому выполнение оператора BACKSPACE приведет к перемещению на 1 байт назад. Последовательный двоичный файл является потоком. Между его записями CVF и FPS не проставляют символов или полей с контрольными данными.
Ввод из двоичного файла значения переменной val, занимающей в оперативной памяти n байт, вызовет перемещение файла на n байт.
Если последовательный двоичный файл перед выполнением оператора вывода находился на байте bi, то bi и все последующие байты в результате вывода будут "затерты" (заменены на выводимые).
Оператор OPEN, подсоединяющий файл к устройству для двоичного последовательного доступа, обязательно включает спецификатор FORM = form, где form - символьное выражение, вычисляемое со значением
'BINARY'.
Пример управления двоичным последовательным файлом FPS: integer(2) :: ia, ib, d(5) = (/ 1, 2, 3, 4, 5 /), i
real(4) :: a |
|
character(3) ca |
|
open(1, file = 'a.dat', form = 'binary') |
! Открываем двоичный файл |
write(1) 1.1, 2.2 |
! Пишем в файл 8 байт |
write(1) d |
! Добавляем в файл 10 байт |
write(1) 'aaa', 'bbb', 'ccc' |
! Добавим в файл еще 9 байт |
337
О. В. Бартеньев. Современный ФОРТРАН
rewind 1 |
|
|
read(1) a, a, (ia, i = 1, 5), ca, ca |
! Читаем 24 байта одним оператором READ |
|
do 2 i = 1, 10 |
! Перемещение назад на 10 записей (байт) |
|
2 backspace 1 |
|
|
read(1) ib |
! Читаем, начиная с 15-го байта |
|
write(*, *) a, ia, ca, ib |
! |
2.200000 5bbb 4 |
rewind 1 |
|
|
read(1) a |
! Файл переместился на 5-й байт |
|
write(1) 'ghi' |
! Заменены 5, 6 и 7-й байты; |
|
rewind 1 |
! все последующие записи "затерты" |
|
read(1) a, ca |
|
|
write(*, *) a, ca |
! |
1.100000ghi (в файле 7 байт данных) |
end |
|
|
Замечания:
1. В CVF при работе с двоичными файлами оператор BACSPACE либо вызывает ошибку исполнения, либо, подобно оператору REWIND, позиционирует файл в его начало, например:
character(1) c |
|
|
open(1, file = 'a.dat', form = 'binary') |
! Открываем двоичный файл |
|
write(1) 'a12', 'b34' |
! Добавим в файл 6 байт |
|
rewind 1 |
! Переход на начало файла |
|
read(1) c |
|
|
print *, 'c = ', c |
! CVF: |
c = a |
|
! FPS: |
c = a |
rewind 1 |
! Переход на начало файла |
|
! Те же действия, но с оператором BACKSPACE |
||
write(1) 'a12', 'b34' |
! Добавим в файл 6 байт |
|
backspace 1 |
|
|
read(1) c |
|
|
print *, 'c = ', c |
! CVF: |
c = a |
end |
! FPS: |
c = 4 |
2. Любой внешний файл может быть открыт как двоичный (поток), например с целью копирования данных.
10.11. Неформатные последовательные файлы
В неформатные файлы, так же как и в двоичные, данные передаются без преобразований. Однако в неформатном файле в отличие от двоичного записью является не байт, а совокупность данных, выводимых в файл в результате выполнения оператора вывода WRITE. Каждый оператор вывода создает одну запись. Записи файла могут иметь разную длину. Каждая запись завершается символами конца записи.
Из неформатного файла одним оператором ввода можно прочитать только одну запись. Попытка такого ввода числа байт, превышающих
338
10. Файлы Фортрана
размер текущей записи, приведет к ошибке выполнения и прерыванию программы.
Выполнение каждого оператора ввода, даже если число вводимых байт меньше числа байт записи, приведет к позиционированию файла вслед за прочитанной записью.
Добавление новой записи при позиционировании файла вслед за записью ri - 1 приведет к удалению записи ri и всех последующих записей (к их замене на добавляемую).
Оператор OPEN, подсоединяющий файл к устройству для неформатного последовательного доступа, включает спецификатор FORM = form, где form - символьное выражение, вычисляемое со значением 'UNFORMATTED'.
Пример управления неформатным последовательным файлом: integer(2) :: ia, ib, d(4) = (/ 1, 2, 3, 4 /)
real(4) a |
|
character(3) ca |
! Открываем неформатный файл |
open(1, file = 'a.dat', form = 'unformatted') |
|
write(1) 1.1, 2.2 |
! Добавление в файл 1-й записи |
write(1) d |
! Вторая запись |
write(1) 'aaa', 'bbb', 'ccc' |
! Третья запись |
rewind 1 |
! Переход в начало файла |
read(1) a, a |
! Соблюдаем соответствие между |
read(1) ia, ia, ia, ia |
! вводом и выводом |
read(1) ca, ca |
|
backspace 1 |
! Переход в начало 3-й записи |
backspace 1 |
! Переход в начало 2-й записи |
read(1) ib, ib |
|
print *, a, ia, ca, ib |
! 2.200000 4bbb 2 |
rewind 1 |
|
read(1) a |
! Переход в начало 2-й записи |
write(1) 'ghi' |
! Замена 2-й и 3-й записей на ghi |
rewind 1 |
|
read(1) a, a |
! В файле осталось 2 записи: |
read(1) ca |
! числа 1.1 и 2.2 и строка ghi |
print *, a, ca |
! 2.200000ghi |
end |
|
10.12. Текстовые последовательные файлы
Текстовой файл содержит символьное представление данных всех типов. При работе с текстовыми файлами используется форматный или управляемый списком В/В. При выводе данные из внутреннего представления преобразовываются во внешнее символьное представление. При вводе происходит обратное преобразование из символьного представления во внутреннее (разд. 9.1).
339
О. В. Бартеньев. Современный ФОРТРАН
При выводе в конце каждой записи Фортран проставляет два неотображаемых символа CHAR(13) - возврат каретки и CHAR(10) - новая строка,. То есть записи являются LF-потоками. В случае вывода под управлением списка оператор вывода вставляет в начало каждой записи пробел (по умолчанию первый символ каждой записи форматного файла рассматривается как символ управления кареткой). Записи текстового последовательного файла могут иметь разную длину.
Порядок изменения позиции текстового файла с последовательным доступом зависит от способа передачи данных (с продвижением или без,
разд. 10.6).
При форматном вводе число читаемых одним оператором ввода из текущей записи данных регулируется форматом (разд. 9.4). В отличие от неформатного файла одним оператором ввода в принципе может быть прочитано произвольное число записей текстового последовательного файла.
В простейшем случае, открывая текстовой файл для последовательного форматного доступа, можно указать в операторе OPEN только устройство внешнего файла и спецификатор FILE = file.
Пример управления текстовым последовательным файлом. (По умолчанию в файлах, открываемых для последовательного доступа,
спецификатор FORM = 'FORMATTED'.):
integer(2) :: ia, ib, d(4) = (/ 1, 2, 3, 4 /) real(4) a, b
character(3)ca
1format(6f7.2)
2format(8i5)
3format(7a4)
! Открываем последовательный текстовой файл a.txt и создаем в нем 3 записи
open(10, file = 'a.txt') |
|
|
write(10, 1) |
1.1, 2.2 |
! Запись 1 |
write(10, 2) d |
! 2 |
|
write(10, 3) |
'a', 'bc', 'def' |
! и 3 |
!После выполнения трех операторов вывода в файле будет 3 записи:
!1.10 2.20
! |
1 |
2 3 4 |
|
|
! |
a |
bc def |
|
|
rewind 10 |
! Переход на 1-ю запись |
|||
read(10, |
1) a, b |
|
||
read(10, |
2) ia, ia, ia |
! Читаем из 2-й записи |
! или вместо двух последних операторов: read(1, *) a, b, ia, ia, ia
read(10, 3) ca, ca |
! Читаем из 3-й записи |
backspace 10 |
! Переход на начало 3-й записи |
backspace 10 |
! Переход на начало 2-й записи |
read(10, 2) ib, ib |
! Читаем в ib 2-й элемент 2-й записи |
write(*, *) a, ia, ca, ib |
! 1.100000 3 bc 2 |
rewind 10 |
! Переход на начало 1-й записи |
340