Bвод и вывод данных
При вводе или выводе данных происходит преобразование данных из текстового представления во внутреннее и обратно. Чаще всего, это обмен данными между программой и внешним носителем информации, обычно файлом или экраном компьютера.
Для ввода и вывода данных в Фортране служат операторы read и write.
Общая форма этих операторов имеет вид:
read (управляющая информация)список переменных
write (управляющая информация) список констант, переменных и выражений
Обмен данными происходит в порядке следования элементов списка.
В список управляющей информации входят:
1) На первом месте в списке – параметр, задающий номер устройства, который имеет вид:
n или символ «*»
где n – целая константа без знака, условный номер, связанный с устройством ввода-вывода (в частном случае с файлом), а символ «*» указывает, что номер устройства задан по умолчанию – клавиатура для ввода и экран для вывода.
2) На втором месте – параметр, определяющий формат ввода или вывода, который имеет вид:
n или ‘(символьное выражение)’ или «*»
где n – метка оператора format, соответствующая оператору ввода или вывода, символьное выражение – спецификация формата, а символ «*» указывает, что формат выбирается компилятором по умолчанию, при этом ввод и вывод производится под управлением списка.
Операторы open и close
Оператор open связывает условный номер устройства с файлом для ввода или вывода данных (“открывает” файл):
open(номер устройства, file=имя файла)
На номер устройства ссылаются операторы read и write. Можно открыть несколько файлов, но каждому из них должен быть сопоставлен уникальный номер устройства. Имя файла – символьная строка.
Если файл не существует, он создается, а если такой файл существует, то он обновляется при выводе. Другие возможности работы с файлами регулируются дополнительными параметрами.
Оператор close отсоединяет файлы от устройства (“закрывает” файлы):
close(список номеров устройств)
Не обязательно явно закрывать открытые файлы. При нормальном завершении программы каждый файл, открытый в ней, закрывается. Однако, следует закрыть файл, если необходимо открыть другой файл на этом же устройстве, не выходя из программы.
Пример.
open(1, file=’in.txt’)
open(2,file=’out.txt’)
read(1,*) a, b
write(2,*) "a =", a, " b =", b, " a+b =", a+b
close(1, 2)
Оператор read – ввод данных
При вводе данные, подготовленные в символьном виде, преобразуются в значения переменных списка в соответствии с форматом (форматный ввод) или с типами переменных (ввод под управлением списка).
Данные, подготовленные для ввода под управлением списка, разделяются между собой запятыми, пробелами или символами конца строки (клавиша <Enter>).
Данные для форматного ввода следует готовить строго в соответствии с выбранным форматом. Это не всегда удобно и используется редко.
Некоторые свойства оператора read:
1) Данные при вводе контролируются
Пример. Ввести число из файла 'data.txt':
1.23
Фрагмент для чтения:
integer m
open (7, file='data.txt')
read (7, *) m
Попытка ввести вещественное значение для целой переменной приведет к ошибке ввода, которая будет зафиксирована на экране монитора (ошибка выполнения): Run-time error F6101: READ(data.txt) – invalid INTEGER
2) В некоторых случаях данные конвертируются в соответствии с типом переменной. Например, если для ввода вещественных переменных подготовлены целые числа, в результате ввода переменным будут присвоены вещественные значения с нулевой дробной частью.
Пример. Ввести числа из файла 'data.txt':
123, 21, 17
Фрагмент для чтения:
real a, b, c
open (7, file='data.txt')
read (7, *) a, b, c ! a= 123.0; b= 21.0; c= 17.0
3) Каждый оператор read начинает читать данные с новой строки, независимо от того, все ли данные предыдущей строки прочитаны.
Пример. Прочитать две строки из файла 'data.txt':
1.23, 4.56 77 55
11, 13
Фрагмент программы для чтения:
real x,y,z; integer m,n
open (7,file='data.txt')
read (7,*)x, y, z ! x= 1.23; y= 4.56; z= 77.0
read (7,*)m, n ! m= 11; n= 13
4) В списке управляющей информации оператора read может присутствовать необязательный параметр end вида
end = метка
Этот параметр указывает, что при достижении конца файла в случае отсутствия ошибок ввода, управление будет передано оператору с меткой метка. Использование этого параметра удобно, когда неизвестно, сколько данных подготовлено в файле.
Пример.
real x, y, z
Do
read (*,*, end=99) x, y, z
write (*,*) x, y, z, sin(x) + sin(y) + sin(z)
Enddo
99 continue ! продолжение программы
Цикл будет продолжаться до тех пор, пока не будут введены все числа, подготовленные в файле.
Примечание. Оператор continue – пустой оператор, по которому не производится действий, а выполнение программы продолжается со следующего оператора.
5) Чтобы избежать аварийного завершения программы вследствие ошибки ввода данных, можно запрограммировать переход на обработку ошибки ввода, указав метку в качестве значения дополнительного параметра err в операторе read, например:
Пример.
integer m,n
Do
read (*,*, err=88) m, n
. . .
Exit
88 write(*,*) ‘ Re-enter the data’ ! Повторите ввод данных
Enddo
Цикл будет продолжаться до тех пор, пока не будут введены целые значения.
Оператор write – вывод данных
При выводе для данных, включенных в список, формируются строки символов в соответствии с форматом, выбранным программистом или назначенным компилятором по умолчанию.
Каждый оператор write начинает вывод данных с новой строки.
Вывод под управлением списка не всегда удобен по ряду причин. Далеко не всегда формат вывода, определенный компилятором, оптимален для оформления результатов. Вследствие своей простоты такой вывод удобен при отладке программ, но для создания привлекательного программного продукта лучше пользоваться форматным выводом.
Оператор format
Форматный вывод позволяет программисту самому определять расположение выводимых данных на устройстве вывода. Операторы format являются неисполняемыми операторами, но в отличие от других неисполняемых операторов, они могут находиться в любом месте программы.
Общая форма оператора format имеет вид:
метка format (список спецификаций)
Метка является обязательной частью оператора format. На нее ссылается хотя бы один оператор ввода или вывода в программе.
Список спецификаций (дескрипторов) состоит из ряда спецификаций (дескрипторов) формата, заключенных в скобки. Разделителями между ними служат запятые или символ «/» – признак перехода к новой строке при выводе.
Пример:
real radius = 1
open (2, file=’Out.txt’)
write(2,55) 2*3.14*radius
55 format('длина окружности'/2x,'с=',F5.2)
Здесь оператор write, используя оператор formatс меткой 55, выводит в файл Out.txt две строки (символ «_» означает пробел):
длина окружности
__c=_6.28
Спецификации, использованные в оператореformat:
- 'длина окружности' и 'с=' – символьные константы, используемые как пояснительный текст;
- 2x – два пробела;
- F5.2 – формат для вывода вещественного числа; число занимает в строке вывода пять позиций, из которых две отводятся под дробную часть.
На один оператор format могут ссылаться несколько операторов вывода. Если список спецификаций используется однократно, то он может быть записан в виде символьного выражения в операторе write. Это выражение заключается в кавычки; кавычки в списке спецификаций должны отличаться от кавычек, обрамляющих выражение (простые и двойные или наоборот).
Пример:
write (2, "(1x,'c=',F5.2)") c
Внимание! Синтаксис символьного выражения в операторе вывода не контролируется компилятором, и ошибки в его написании будут выявлены только на этапе выполнения, в отличие от оператора format с меткой. Поэтому в операторе вывода write не рекомендуется писать длинные списки спецификаций.
Дата добавления: 2017-09-19; просмотров: 754;