Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1800

.pdf
Скачиваний:
5
Добавлен:
15.11.2022
Размер:
925.77 Кб
Скачать

Reset(f);

где f — имя файловой переменной. Если файл не пуст, указатель перемещается к первой компоненте файла, а если пуст — к концу файла. Файл становится открытым для чтения и записи. Если физического файла, связанного с файловой переменной f не существует, то программа останавливается с сообщением об ошибке.

Для создания нового файла предусмотрена процедура

Rewrite(f);

где f — имя файловой переменной. Если f связана с существующим файлом, то он подготавливается к перезаписи: все содержимое игнорируется, признак конца файла перемещается в начало, указатель устанавливается в начало файла. Файл становится открытым для записи и закрытым для чтения.

После использования файла его необходимо закрыть процедурой

Close(f);

Операцию закрытия файла следует располагать как можно ближе к операции открытия для того, чтобы свести к минимуму интервал времени, в течение которого файл открыт. Благодаря этому снижается вероятность повреждения файловой системы вследствие аварийного завершения программы (например, после внезапного отключения питания).

Операции ввода-вывода

Для чтения из файла используется процедура

Read(f,v1[,v2,...,vn]);

первым аргументом которой является имя файловой переменной f. Остальные параметры — это переменные, в которые будет помещаться прочитанная информация из компонент файла. Тип этих переменных должен совпадать с базовым типом файла. При прочтении каждой компоненты указатель файла перемещается к следующей позиции.

60

Запись в файл осуществляется с помощью процедуры

Write((f,v1[,v2,..,vn]);

первым аргументом которой является имя файловой переменной f. Остальные параметры — переменные или выражения, значение которых будет помещено в файл.

Перемещения по файлу

Все компоненты типизированных файлов проиндексированы начиная с нуля, что позволяет организовать произвольное перемещение указателя по файлу и доступ к любой компоненте такого файла в любой момент времени.

Процедура

Seek(f,n);

перемещает текущий указатель в файле f на позицию с номером n. Значение формального параметра n должно принадлежать типу LongInt.

Процедура

Truncate(f);

усекает файл (обрезает его) на текущей позиции. Функция

FileSize(f): longint;

возвращает текущий размер файла (номер последней компоненты), выраженные в количестве записанных в него компонент. Значение возвращаемого результата принадлежит типу

LongInt.

Функция

FilePos(f): longint;

возвращает номер позиции положения указателя в файле. Функция

EoF(f): boolean;

определяет, достигнут ли конца файла. Она возвращает значение true, если указатель находится за последней компонентой файла, false — в противном случае.

61

Текстовые файлы

Кроме описанных выше файлов во Free Pascal применяется специальный вид файлов, предназначенный в основном для работы с текстовой информацией. Этот тип файлов объявляется с помощью служебного слова text, например

Var

t: text;

Работа с текстовыми файлами отличается от работы с нетекстовыми файлами. Компонентами текстовых файлов являются строки различной длины, разделённых между собой признаком конца строки. Компоненты текстовых файлов не индексируются, поэтому произвольный доступ к ним невозможен. Размер окна указателя файла равен одному байту и соответствует размеру одного символа. Данные, выводимые в текстовый файл, автоматически преобразуются к текстовому виду.

Процедуры и функции для работы с текстовыми файлами

К текстовым файлам помимо описанных выше применимы следующие процедуры и функции.

Процедура

Append(F);

открывает существующий текстовый файл для добавления информации в конец. Здесь и далее буквой F обозначена файловая переменная типа text.

Процедура

Readln(F, V1, [V2, V3,... Vn]);

читает информацию из текстового файла. Процедура

Writeln(F, V1, [V2, V3,... Vn]);

записывает информацию в текстовый файл и выводит в файл признак конца строки. Переменные V1, V2,... Vn с последних двух процедурах должны быть описаны как переменные одного из стандартных типов, чтобы компилятору был

62

известен способ преобразования значения в строку и наоборот.

Процедуры Readln и Writeln осуществляют те же действия, что и процедуры Write и Read, но после операций чтения и записи производят переход к следующей строке текстового файла. Процедура Read переходит к следующей строке только в случае исчерпания текущей строки. Процедура Readln позволяет совершить этот переход не дожидаясь конца строки.

Функция

Eoln(F);

осуществляет проверку признака конца строки. Она возвращает значение true, если указатель находится в позиции признака конца строки, false в противном случае.

Функция

SeekEoln(F): bolean;

производит поиск конца текущей строки файла. Она перемещает указатель на следующую позицию в строке и возвращает true, если достигнут конец строки.

Функция

SeekEof(F): boolean;

производит поиск конца файла. Она перемещает указатель на следующую позицию и возвращает true, если достигнут конец файла.

Работа со строками

Тип String

Наиболее очевидным способом для работы с текстом является применение массивов, содержащих данные символьно-

го типа (char). var

s: array[1..50] of char;

Однако, такой подход не совсем удобен. Поэтому для работы с текстом в языке Pascal был введён специальный тип данных

63

string, предназначенный для работы со строками текста. При объявлении строковых типов и переменных используется служебное слово string, после которого в квадратных скобках указывается максимальная длина строки. Например:

var

st: string[50];

При компиляции программы для хранения переменной st будет выделен 51 байт памяти. Байты с номерами 1..50 будут использованы для хранения символов строки. Однако хранимая в переменной st строка может быть короче. Поэтому байт с номером 0 будет хранить реальную длину строки. Если при описании строковой переменной не указана максимальная длина строки, что используется значение по умолчанию 255.

Присваивание строк

Значение строковой переменной может быть присвоено оператором присваивания, либо введено процедурой ввода:

st := 'Это строка.'; Readln(st);

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

Операция конкатенации

Конкатенацией называется сложение строк, обозначаемое знаком +. При этом происходит сцепление строк: каждое следующее «слагаемое» добавляется в конец предыдущего. Излишек, превышающий максимальную длину строки усекается. Например:

program Primer1; var s: string; begin

s := 'складываем ' + 'строки!';

64

writeln(s1);

{складываем строки!}

end.

Длина строки

В классическом языке Паскаль максимальная длина строки не может превышать 255 символов. В рамках 255 символов строки могут динамически изменять свою длину. Например, после присваивания

S:=’Москва’;

длина строки S равна 6 символам. Следующее присваивание

S:=S+’ столица России!’;

добавляет к строке еще 10 символов и ее длина увеличивается до 16 символов.

Для вычисления текущей длины строки S служит функ-

ция

Length(S): byte;

Процедуры и функции для работы со строками

Для конкатенации строк можно помимо знака + использовать функцию

Concat (S1, [S2, ..., Sn]): string;

Здесь S1, S2, ..., Sn — объединяемые строки.

Поиск подстроки в строке осуществляет функция

Pos (P,S): byte;

Здесь P — искомая подстрока, S — строка, в которой производится поиск. Результатом поиска считается номеру первого символа строки S, с которого начинается искомая подстрока P, или 0, если подстрока не найдена.

Для копирования подстроки из строки предусмотрена функция

сopy (Stroka, Nomer, Dlina);

где Stroka — исходная строка, Nomer — номер первого копируемого символа строки, Dlina — количество копируемых символов. Если значение параметра Nomer больше длины исходной строки, возвращается пустая строка. Если

65

{форма}

Nomer+Dlina больше длины исходной строки и всех необходимых символов в строке нет, возвращается имеющийся остаток строки.

program Primer2; var

st: string; s1: string[10];

begin

st := 'информатика'; writeln(st); {информатика} s1 := copy(st,3,5); writeln(s1);

end.

Процедура

Delete (S, Nomer, Dlina);

удаляет подстроку из строки S. Параметр S является парамет- ром-переменной и доступен для изменения процедурой Delete. Поэтому фактическое значение этого параметра может быть только именем переменной строкового типа. Остальные параметры: Nomer — номер первого удаляемого символа, Dlina — количество удаляемых символов. Если значение параметра Nomer больше длины исходной строки, удаления не производится. Если Nomer+Dlina больше длины исходной строки, удаляется остаток строки начиная с номера Nomer.

Процедура

Insert (P, S, Nomer);

вставляет подстроку P в строку S начиная с номера позиции Nomer. Если длина результирующей строки превышает максимальный размер, то строка усекается. Параметр S является параметром-переменной.

program Primer3; var

st: string;

66

begin

st := 'информатика'; writeln(st); {информатика} Delete(st,8,4);

writeln(st); {информа} insert(’ция’, st, 8); writeln(s1); {информация}

end.

Отдельные символы строки

Доступ к отдельным символам строки возможен аналогично доступу к элементам одномерного массива. Считается, что символы строки нумеруются с 1. Элемент строки с номером 0 используется для хранения текущей длины строки. Следующая программа выводит посимвольно в столбик введенное с клавиатуры слово.

program Primer4; var

st: string; j : integer;

begin

WriteLn(’Введите слово:’); ReadLn(st);

For j:=1 to Length(st) do WriteLn(st[j]);

end.

Следует заметить, что работа со строкой как с символьным массивом остается корректной до тех пор, пока учитывается текущая длина строки. Так, например в следующем примере делается попытка посимвольно заполнить пустую строку h символами строки st.

program Primer5; var

67

st,h: string; j : integer;

begin

WriteLn(’Введите слово:’); ReadLn(st);

For j:=1 to Length(st) do h[j]:=st[j]; {*}

WriteLn(h); {Выведется пустая строка}

end.

Поскольку длина строки h при таком присваивании не изменилась, выведется пустая строка. Поэтому правильно строку, обозначенную звездочкой писать так:

h:=h+st[j]; {*}

Вместе с тем, допускается принудительное изменение длины строки путем изменения ее нулевого элемента. Следует иметь в виду, что переменная st[0] имеет тип char. Поэтому длину строки типа byte следует привести к типу char либо с помощью знака #, либо с помощью функции chr(), например, st[0]:=#125. Здесь 125 — новая назначаемая длина строки, #125 (то же самое что chr(125)) — символ, соответствующий коду 125.

Практические задания

Вариант 1.

Напишите функцию приближенного вычисления квад-

ратного корня по формуле x

n

 

xn 1

 

a

, x 1,

 

 

 

 

 

2

 

1

 

 

 

 

 

2xn 1

xn

 

.

 

 

 

 

 

 

a

 

 

 

 

 

 

Найдите корни всех чисел, из входного текстового файла, добавить их в тот же файл рядом с исходными.

68

Вариант 2.

Дано предложение, слова в нем разделены одним или несколькими пробелами. Предложение записано в текстовом файле. Замените каждое слово количеством букв ‘а’ в нем.

Необходимо написать и использовать функцию подсчета количества заданной буквы в слове.

Варианты 3 – 18.

В текстовом файле находятся записи о номерах телефонов. В каждой строке записана информация об одном абоненте: №телефона, ФИО, адрес. Задачи необходимо решить с использованием процедур и функций.

3.Напишите программу, которая осуществляет добавление записи в файл с проверкой корректности данных (не существует ли уже добавляемая запись).

4.Напишите программу, которая удаляет из файла указанную запись.

5.Напишите программу, которая согласно запросу пользователя выводит информацию об абонентах, фамилия которых начинается с заданной буквы.

6.Напишите программу, которая согласно запросу пользователя выводит информацию об абонентах, подключенных к одной АТС.

7.Напишите программу, которая осуществляет поиск абонента с заданной фамилией.

8.Напишите программу, которая осуществляет поиск абонента с заданным именем.

9.Напишите программу, которая осуществляет поиск абонента с заданной фамилией.

10.Напишите программу, которая для каждой АТС выводит процент заполненности телефонных номеров.

11.Напишите программу, которая выводит диапазоны свободных номеров телефонов для каждой АТС.

12.Напишите программу, которая сортирует записи в файле в порядке возрастания номера телефона.

69

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]