
- •Часть 3
- •Содержание
- •30. Работа с файлами
- •Примечание:
- •31. Открытие файлов
- •File not found
- •32. Непосредственная работа с файлом
- •33. Форматный вывод информации
- •34. Форматное чтение информации из файла
- •35. Обработка сбойных ситуаций и ситуаций “конец файла” при вводе-выводе информации
- •Обработка сбойной ситуации:
- •7 Write (6,*) ’Введите a,I,b’
- •Обработка ситуации “конец файла”:
- •36. Операторы для работы с записями в файле
- •37. Дополнение файла информацией
- •Первый способ дополнения файла информацией:
- •10 Write (6,*)’Всего записей в файле’,kzap
- •Второй способ дополнения файла информацией
- •4 Write (6,*)’в файле было записей’,kz
- •38. Работа с текстом
- •39. Текстовые константы
- •Правило:
- •10 Format (a8)
- •10 Format (a)
- •1) Вводится меньше 8 символов, то они помещаются в переменную imfile, а недостающие до 8 позиции дополняются пробелами.
- •2) Вводится имя большего размера, чем 8 позиций, то будут восприняты только первые 8 символов и они будут записаны в переменную imfile;
- •8 Format (a10/5a5)
- •9 Format (1x,a10/1x,5a5)
- •9 Format (1x,a10/1x,5a5)
- •Семин а.В.
- •Правила ввода-вывода текстовой информации:
- •1). Ввод информации
- •Примечание:
- •40. Текстовые подцепочки
- •41. Вывод графиков
- •42. Эквивалентирование текстовых переменных
- •If(fam1.Eq.Fam2) write(6,9) fam2,k1,k2,k3,k4
- •7 Format (a40,i5,a15,i5,a7)
- •If (ngod.Ne.1962) goto 4
- •9 Format (1x,a40,i5,a15,i5,a7)
- •10 Write(4,*)’Конец просмотра базы данных’
- •43. Создание библиотек
- •44. Решение дифференциальных уравнений
- •45. Работа с комплексными данными
- •Правило:
- •46. Ввод-вывод переменных комплексного типа
- •Примечание:
- •47. Встроенные функции комплексного типа
- •48. Оператор equivalence
- •Правило:
- •49. Результаты арифметических операций в выражениях с данными разного типа
- •50. Файлы прямого доступа
- •51. Способы передачи форматных записей
- •52. Модификации оператора цикла do
- •6 Continue
- •If (y.Lt.0.05) cycle
- •55. Командные файлы
- •If errorlevel 1 go to exit
- •If errorlevel 1 go to done
32. Непосредственная работа с файлом
При выполнении оператора OPENоткрывается файл по указанному каналу, и указатель считывания записи устанавливается на первую запись.
Указатель считывания записи – аппаратная величина, которую мы наблюдать не можем. Указатель считывания записи перемещается от одной записи к другой при выполнении или READилиWRITE, а при форматной обработке информации при выполнении символа слэш (/) оператораFORMAT.
Пример:
FORMAT(/// …) – пропустить 3 записи и начать обработку информации с 4-й строки.
Пример работы с файлом:
…
OPEN(2, FILE=’WYHOD.REZ’, STATUS=’NEW’)
WRITE (2,*) ‘ A=’,A,’ B=’,B
WRITE (2,*)
WRITE (2,*) ‘Результат расчёта’
WRITE (2,*) ‘сумма =’,S
…
Эта информация появится в файле так же, если бы она выводилась на экран. WRITE(2,*) выведет в файле пустую строку.
Предположим, с помощью текстового редактора мы создали файл DAN1.DATи в него занесли числовую информацию в бесформатном виде.
-1.5,2.7
3.8,6.5,1.7
8.9,-1.65,8.3
2.1,3.8,0.
6.3,4.5
-15.75,-6.9
3.8,-2.5
Файл записан на жесткий диск. Попробуем читать содержимое файла и отметим особенности выполнения операций
.
.
OPEN(3 , FILE = ’DAN1.DAT’ , STATUS = ‘OLD’)
READ(3,*)A1,B1 При чтении файла переменным будут присваиваться значенияA1=-1.5 ,B1=2.7
READ(3,*)A2,B2 Переменным будут присвоены значениеA2 = 3.8,B2=6.5. Число 1.7 из второй записи не прочтется, так как закончился список ввода.
READ(3,*) По этому оператору третья запись будет пропущена без чтения, так как в операторе отсутствует список ввода.
READ(3,*)A4,B4,C4,D4 Здесь список ввода больше, чем количество данных в следующей записи. Поэтому при бесформатном вводе получимA4=2.1 ,B4=3.8 ,C4=0. , а значениеD4 прочтется автоматически из следующей, пятой по счету записиD4=6.3 . Число 4.5 из пятой записи останется непрочитанным.
READ(3,*)FПрочтется число -15.75
После выполнения этого оператора указатель считывания записи устанавливается перед последней строкой данных, если далее последует оператор чтения, то эти данные будут считаны. Если же последует оператор вывода информации по этому каналу, например:
WRITE(3,*)’Результаты расчетаS= ’,S
то в файл выведется эта информация, а последняя строка данных (а если бы за ней была и другая информация до конца файла) будет уничтожена.
33. Форматный вывод информации
Форматный вывод информации рассмотрим на примере (аналогичен простому форматному выводу на экран):
Пример:
…
OPEN(3, FILE=’WYHOD.REZ’, STATUS=’NEW’)
WRITE (3,7) A,B,C, (D(I),I=1,N)
FORMAT(//1X,’A=’,F6.2,T12,'B=',F4.1,5X, 'C=',F5.2/1Х,'Массив D'/
* (1X,7(E10.3)/))
…
34. Форматное чтение информации из файла
Ввод данных из файла позволяет облегчить работу по вводу данных в программу, так как не надо будет вводить числа с клавиатуры. Это особенно актуально при отладке программы и устранении ошибок, когда запуск программы и ввод данных осуществляется большое количество раз. В этом случае чтение данных из файла сэкономит много времени и усилий. Этот ввод незаменим при вводе огромного количества информации.
Текстовым редактором создаётся файл исходных данных (например, ISH.DAN). Предположим, что он будет иметь следующее содержание:
Программа
расчёта магнитного поля
Автор Иванов И. И. 3 строки
1 2 28
Радиус обмотки внутренний Радиус обмотки внешний Высота обмотки Н Значение тока |
|
Расчёт магнитного поля на оси по высоте от до |
|
Задача:
Прочитать информацию из файла
Произвести вычисление по заданию
Результаты расчёта поместить в этот же файл.
DIMENSION B(100)
OPEN(UNIT=3, FILE=’ISH.DAN’, STATUS=’OLD’)
READ (3,8) RB,RBN,H,I,HN,HK
FORMAT(///3(28X,F6.3/)28X,I3//28X,F4.1/28X,F4.1/)
Пропускаем 3 строки. Затем три раза идет повторение группы форматов: в четвертой строке пропускаем 28 символов и читаем число RB по формату F6.3; переходим на пятую строку, пропускаем 28 позиций и читаем число RBN; переходим на шестую строку, пропускаем 28 позиций и читаем число H, переходим на новую строку. Пропускаем 28 позиций и читаем значение тока I по формату I3. Пропускаем две строки, затем 28Х и читаем HN, переходим на новую строку, 28Х и читаем HK. Пропускаем еще одну строку с чертой. Когда оператор FORMAT завершает свою работу, указатель считывания записи перемещается на 1 строку вниз.
CДопустим количество точек
N=50
Значением задаёмся самостоятельно, так как это не задано в условии. Предположим, что мы обращаемся к подпрограмме, которая по введенным исходным данным вычисляет значения индукции магнитного поля и результаты заносит в массив В размерностью N.
CALL INDUK(RB,RBN,H,I,HN,HK,B,N)
CВывод информации
WRITE (3,10) (J,B(J),J=1,N)
10 FORMAT(/1X, ‘Результаты расчета’/(1X,'B(',I3,')=',G10.4/))
Вывод информации осуществляется в файл, открытый по каналу 3. Выводимая информация будет размещаться, начиная с того места, где остановился указатель считывания записи. Если файл данных не прочитан до конца, то вся информация, расположенная ниже того места, где в настоящее время находится указатель считывания записи, будет уничтожена. Весь массив будет выведен в 1 столбец.
После второго символа / перед группой спецификаций, заключенной в скобки, не стоит количество повторений. Это значит, что данная группа спецификаций будет повторяться бесконечное количество раз до тех пор, пока не будет исчерпан список вывода оператора WRITE.
Такой вывод информации нельзя признать хорошим. Желательно выводить не только номер элемента массива и его значение, но и значение аргумента Н, при котором рассчитано это значение. Для этой цели можно:
создать массив значений аргумента
вычислять текущее значение высоты Н в процессе вывода информации и выводить это значение:
HT=HN+(J–1)*(HK–HN)/(N–1)
Вычисление этого выражения можно оформить в операторе-функции, но можно в качестве арифметического выражения записать прямо внутри оператора вывода WRITE. Это будет выглядеть так:
WRITE (3,10) (HN+(J–1)*(HK–HN)/(N–1), B(J),J=1,N)
10 FORMAT(/1X,’Результат расчёта’/(1X,’При H=’,F4.2,
*’B=’,G11.4/))
WRITE (3,11)
11 FORMAT (1X,70(’=’))
CLOSE(3)
PAUSE
STOP
END
Предполагаем, что программа INDUKнаходится в библиотеке стандартных программ. Но если эта программа написана пользователем и хранится в виде отдельного файла в этом же каталоге, то её можно подключить к данной головной программе с помощью метакоманды:
$INCLUDE.
Она записывается в том месте текста головной программы, куда нужно ставить текст подпрограммы. Записываем с первой позиции строки метакоманду:
$INCLUDE: ’INDUK.FOR’
Если этот файл находится в другом месте, то необходимо указать полный путь к нему $INCLUDE: ’D:\Fortran\MyProg\INDUK.FOR’
Метакоманда начинается символом “ $ ” с первой позиции, а в данном случае INCLUDEвключает в текст программы имя файла, который указан в текстовой строке.