- •Программирование на языке Pascal
- •Модуль 1. Введение в язык Pascal
- •Что такое программирование?
- •Листинг 1
- •Листинг 2
- •Среда программирования Turbo Pascal 7
- •Переменные и типы данных
- •Что такое переменная?
- •Типы данных
- •Структура программы на Pascal
- •Листинг 3
- •Раздел деклараций
- •Листинг 4
- •Листинг 5
- •Требования к именам идентификаторов
- •Основная часть программы
- •Математические операции
- •Ввод и вывод значений переменных на экран
- •Ввод значений
- •Вывод значений
- •Практикум: Разработка программы «Конвертер единиц измерения»
- •Практикум: Разработка программы, вычисляющей корни квадратного уравнения
- •Модуль 2. Обработка информации и управление ходом выполнения программы
- •Условный оператор
- •Логические выражения
- •Логический тип данных
- •Вложенный условный оператор
- •Оператор множественного выбора (case)
- •Практикум: Разработка программы, проверяющей возможность существования треугольника с заданными сторонами
- •Практикум: Вывод названия года в старояпонском календаре по номеру года
- •Дополнительный материал к модулю 1 и к модулю 2
- •Подключение дополнительных модулей
- •Пример 1. Модуль CRT - очистка содержимого экрана
- •Пример 2. Модуль CRT – Работа с текстом
- •Позиционирование курсора
- •Изменение цвета текста
- •Пример 3. Модуль DOS - Получение текущей даты и времени
- •Форматированный вывод
- •Целые числа
- •Вещественные числа
- •Генерация псевдослучайных значений
- •Модуль 3. Операторы повторения (циклы)
- •Цикл с параметром
- •Практикум: Вычисление факториала числа
- •Контроль арифметического переполнения
- •Цикл с предусловием
- •Практикум: Программа-screensaver
- •Цикл с постусловием
- •Оператор досрочного прерывания цикла (break)
- •Практикум: управление символом на экране при помощи клавиш управления положения курсором
- •Оператор безусловного перехода к следующей итерации (continue)
- •Модуль 4. Одномерные массивы
- •О выходе значения индекса за допустимый диапазон
- •Типовые задачи, связанные с массивами
- •Ввод и вывод элементов массива
- •Подсчет суммы всех элементов массива
- •Нахождение минимального и максимального элемента в массиве
- •Сортировка элементов массива
- •Об особенностях объявления массивов
- •Пользовательские типы данных
- •Константы
- •Рекомендуемый способ объявления массивов
- •Практикум: Разработка приложения «Змейка»
- •Представление строк в Pascal
- •Операции над строками
- •Практикум: Проверка корректности ввода чисел. Преобразование строки в число
- •Практикум: Подсчет слов в предложении
- •Функции для работы со строками
- •Copy
- •Insert
- •Delete
- •Многомерные массивы
- •Ввод и вывод значений многомерного массива
- •Изменение порядка строк в таблице
- •Модуль 6. Записи и множества
- •Модуль 7. Функции и процедуры
- •Объявление подпрограмм
- •Объявление функций
- •Объявление процедур
- •Вызов подпрограмм
- •Формальные и фактические параметры
- •Локальные и глобальные переменные. Область видимости переменных
- •Рекурсия
- •Передача параметров по значению и по ссылке
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача массивов в подпрограммы, открытые массивы
- •Модуль 8. Работа с файлами
- •Связывание файловой переменной с файлом
- •Чтение из файла
- •Проверка существования файла
- •Чтение всего содержимого файла, функция EOF
- •Запись в файл
- •Закрытие файла
- •Текстовые файлы
- •Дозапись в текстовый файл
|
88 |
Программирование на языке Pascal |
Операцию связывания необходимо выполнять всегда, независимо от того, какие именно действия планируется совершать с файлов: чтение, запись или дозапись.
Дальнейшие шаги во много зависят от наших планов на файл.
Чтение из файла
При чтении из файла, необходимо выполнить инициализацию файловой переменной, во время которой проверяется существование файла (если файл будет не найден, то программа аварийно завершит свою работу), если таковой найден – то открытие его и перемещение логического указателя на начало файла.
Reset(файловая переменная);
Для чтения очередной порции данных из файла используется знакомая нам уже процедура Read, только список ее аргументов будет расширенным. В качестве первого аргумента используется файловая переменная, по которой определяется из какого файла необходимо производить чтение. В качестве последующих параметров необходимо указывать переменные, куда будут записываться считанные из файла значения. Типы данных этих переменных должны совпадать с типом, указанным при объявлении файловой переменной. При каждом вызове процедуры Read, указатель в файле смещается к следующей записи. Поэтому, для того, чтобы считать весь файл целиком, необходимо вызвать процедуру чтения столько раз, сколько записей находится в файле.
Приведем несколько примеров.
Пример 1.
Var f: file of Integer;
Buf: Integer;
Begin
Assign(f, 'c:\datfile.dat'); Reset(f);
Read(f, Buf);
…
В данном примере в переменную buf будет записано первое число, записанное в файл c:\datfile.dat. Если бы потребовалось считать следующее значение, мы бы вызвали процедуру read повторно.
Пример 2.
Const ROWS=10;
COLS=10;
Type TRow=array[1..COLS] of Integer; TMatrix=array[1..ROWS] of TRow;
Var f: file of TMatrix; M:TMatrix;
Begin
Assign(f, 'c:\table.dat'); Reset(f);
Read(f, M);
…
В этом примере в переменную M целиком записывается матрица из файла. Соответственно, записью в этом файле будет считаться таблица из 10х10 целых чисел – т.е. 10х10х2=200 байт (2 байта занимает число Integer, таких чисел 100).
88
|
89 |
Программирование на языке Pascal |
Проверка существования файла
Как мы уже выяснили, при инициализации файла при помощи процедуры reset, важно, чтобы файл уже существовал, ведь в противном случае, программа аварийно завершит свою работу, или, проще говоря – «вылетит». Для того, чтобы программа вела себя корректно, необходимо проверить существование файла, и в случае, если файл не будет найден, выдать сообщение пользователю и предпринять какие-либо действия, которые обусловлены конкретной задачей, например – попросить ввести имя пользователя еще раз или корректно завершить работу программы.
Общий алгоритм проверки существования файла будет следующим:
1.Отключается контроль ошибок ввода/вывода при помощи директивы компилятора
{$I-};
2.Выполняется инициализация файла процедурой Reset;
3.Контроль ошибок ввода/вывода включается вновь {$I+};
4.Анализируется значение функции IOResult. Если эта функция вернула нулевое
значение – значит все хорошо, файл существует и к нему открыт доступ, в противном случае – она возвращает ненулевое значение.
Собирая все вместе, получим следующий код:
Var filename:string; f:file of Integer;
i:Integer;
Begin
Repeat
Writeln('Введите имя файла'); Readln(fileName);
Assign(f, filename);
{$I-}
Reset(F);
{$I+}
Until IOResult=0; Read(f, i);
…
Чтение всего содержимого файла, функция EOF
Как мы уже заметили, чтение из файла осуществляется по записям. При каждом вызове процедуры Read происходит чтение ровно одной записи. Для того, чтобы прочитать файл целиком, необходимо будет выполнить чтение столько раз, сколько записей в файле. В общем случае нам может быть неизвестно количество записей в файле, поэтому часто применяют конструкцию «до тех пор пока не конец файла выполнять чтение», которая реализуется за счет цикла While и функции EOF.
Функция EOF расшифровывается как End Of File – конец файла. Ее аргументом является файловая переменная, ассоциированная с файлом из которого производится чтение. Функция возвращает True, если достигнут конец файла и False – в противном случае. Таким образом, схема чтения всего содержимого файла будет следующей:
Var f: File Of DataType;
Buf: DataType;
Begin
Assign(f, ИМЯ_ФАЙЛА);
{$I-}
89