Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Praktikum_po_programmirovaniyu.doc
Скачиваний:
23
Добавлен:
09.12.2018
Размер:
2.5 Mб
Скачать

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

Текстовый файл представляет собой совокупность строк разной длины. Поэтому к каждой строке файла возможен

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

Текстовый файл может содержать данные любых типов, представленных в виде строк символов.

Для описания текстового файла используется стандартный тип text:

125

var f1, f2: text;

Текстовые файлы могут создаваться с помощью текстового редактора или с помощью операторов Write и Writeln самой программы. В конце каждой строки текстового файла ставится специальный признак EOLN (End Of Line – конец строки), На практике такой специальный признак представляет последовательность из двух символов: перевод строки Chr(13) и возврат каретки Chr(10). В конце всего файла ставится специальный признак EOF (End Of File - конец файла).

При создании текстового файла с помощью текстового редактора признак EOLN вводится при нажатии Enter. Признак конца файла EOF можно сформировать с клавиатуры с помощью команды Ctrl+Z. Автоматически признак конца формируется при запоминании текстового файла по команде Save из среды Паскаля.

При программном создании текстового файла с помощью операторов программы признак конца строки формируется процедурой Writeln, а признак конца файла процедурой Close.

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

var f: text;

str: string;

begin

assign(f,’a.txt’);

rewrite(f);

Открытие текстового файла можно произвести тремя способами:

- поставить в соответствие файловой переменной f имя файла процедурой Assign и открыть новый файл для записи процедурой Rewrite.

- поставить в соответствие файловой переменной f имя

файла процедурой Assign и открыть уже существующий файл процедурой Reset.

126

- поставить в соответствие файловой переменной f имя файла процедурой Assign и открыть уже существующий файл процедурой Append. Эта процедура открывает уже существующий файл и устанавливает указатель на конец файла. После такого открытия текстовый файл можно только дополнять информацией, начиная с конца последней строки.

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

При организации ввода-вывода в текстовых файлах используются следующие функции: Eoln, Eof, SeekEoln, SeekEof.

Функция Eoln(var f: text):boolean возвращает true, если указатель позиции находится на маркере конца строки или вызов функции Eof(f) возвратил значение True.

Функция Eof(var f: text):boolean возвращает значение true, если указатель позиции файла находится сразу за последним компонентом файла.

Функция SeekEoln(var f: text): boolean возвращает значение True при достижении маркера конца строки. При этом указатель файла пропускает все пробелы и знаки табуляции, предшествующие маркеру.

Функция SeekEof(var f: text): Boolean возвращает

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

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

127

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

Информация, предназначенная для записи в файл, передается в назначенный этому файлу буфер ввода-вывода. Физическая запись на внешнее устройство происходит только после полного заполнения буфера. После физической записи на диск буфер очищается и ждет приема новой порции информации. Благодаря такой организации обмена удается оптимально сочетать количество обращений к диску и длительность обращений. При физической записи на диск при каждом вызове процедуры Writeln тратится слишком много времени на позиционирование головки чтения-записи для доступа к файлу.

Для непосредственной физической записи информации в файл сразу после вызова процедур Write и Writeln используется специальная процедура выделения необходимого объема текстовому файлу f. Эта процедура вызывается либо сразу после операции Assign, либо сразу после операции открытия файла до начала операций обмена. В этом случае потери информации исключаются. Действие процедуры распространяется до следующего использования файловой переменной f новым внешним файлом.

Процедура SetTextBuf(var f: textvar Buf[;size:word]); дает возможность назначить свой буфер ввода-вывода Buf необходимого объма size текстовому файлу f. Пример:

var

f: text;

ch: char;

{Задаем размер буфера = 2 Кбайта}

buf: array[1..2048] of char;

128

begin

assign(f, ‘a.dat’);

{Устанавливаем файлу буфер размером 2 Кбайта}

setTextBuf(f,buf);

reset(f);

while not eof(f) do

begin

read(f,ch);

write(ch);

end;

end.

Рассмотрим более подробно процедуры ввода-вывода в текстовых файлах.

Вывод данных в текстовый файл производится с помощью процедур write и writeln.

Обращение к процедуре write:

write(f, список данных);

Процедура writeln аналогична процедуре write за исключением того, что выводимая строка завершается кодом конца строки: EOLN.

Для ввода данных из текстового файла используются процедуры read и readln.Обращение к процедуре read:

read(f,список данных);

Процедура readln аналогична процедуре read за

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

Пример. Создать текстовый файл и определить количество пробелов в каждой строке текстового файла.

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

129

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

program ft;

var

f: text; {Определяем тип файловой переменной}

ch:char;

str:string;

i,n,k,s:integer;

ks:array[1..20] of integer;

begin

writeln(‘Введите кол-во строк в файле’);

readln(n);

assign(f,'a.txt');

{Формируем текстовый файл}

rewrite(f);

for i:=1 to n do

begin

readln(str);

writeln(f,str); {Записываем введенную строку в файл}

end;

{Отражаем содержимое файла на экране}

reset(f);

while not eof(f) do

begin

readln(f,str); ); {Считываем полностью одну строку}

writeln(str); {и выводим ее на экран}

end;

{Подсчет количества пробелов в строках}

reset(f);

s:=1;

130

while not eof(f) do {Пока не достигнут конец файла}

begin

k:=0;

while not eoln(f) do {Пока не достигнут}

{конец строки}

begin

read(f,ch); {Считываем из}

{текущей строки по}

{одному символу}

if (ch = ' ') then

begin

k:=k+1;

ks[s]:=k;

end;

end;

s:=s+1;

writeln(' s = ',s);

readln(f); {Перевод текущего указателя на}

{начало новой строки}

end;

for i:=1 to s-1 do

writeln(ks[i],' ');

close(f);

end.

Контрольные вопросы и упражнения

1. Дан файл, компонентами которого являются целые числа. Найти сумму и произведение компонент заданного файла.

2. Дан файл, компонентами которого являются целые числа. Вывести на экран последнюю и предпоследнюю компоненты этого файла.

131

3. Дан файл, компонентами которого являются целые числа. Найти максимальное значение среди компонент с нечетными номерами.

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

Разрешается использовать только один вспомогательный файл.

5. Дан текстовый файл f, содержаший программу на языке Паскаль. Проверить эту программу на несоответствие числа открывающих и закрывающих круглых скобок. Считать, что каждый оператор программы:

- занимает не более одной строки файла;

- может занимать произвольное число строк файла f.

6. Дан текстовый файл f. Получить все его строки, содержащие более 60 символов.

7. Дан текстовый файл f. Вывести на экран самую длинную строку файла. Если в файле имеется несколько строк с наибольшей длиной, то вывести все строки.

8. Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g. Порядок строк в файле g должен:

- совпадать с порядком исходных строк в файле f;

- быть обратным по отношению к порядку строк исходного файла.

9. Написать программу, которая подставляет номера строк (в качестве комментариев) в конец каждой строки с исходным текстом.

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

132

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

11. Даны текстовый файл и строка s. Вывести на экран все строки файла f, содержащие в качестве фрагмента строку s.

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

13. Матрица размерностью n×n, содержащая простые числа, записана в файле по строкам. Указать столбцы, содержащие одинаковый набор элементов (порядок следования элементов роли не играет). Использовать дополнительные массивы и файлы не разрешается.

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

15. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент не равна нулю. Числа в файле идут в следующем порядке: десять положительных, десять отрицательных и т.д. Переписать компоненты файла f в файл g в следующем порядке: пять положительных, пять отрицательных и т.д. Решить эту задачу также при условии,

что перезапись в указанном порядке производится внутри одного файла, дополнительного файла g использовать нельзя.

16. Задано два файла записей. Сформировать третий файл, содержащий четные записи первого файла и нечетные второго файла.

17. Дано два файла записей типа: номер прибора, год выпуска, цена. Поменять содержимое этих двух файлов. Дополнительного файла не использовать.

133

18. Дано два файла записей типа: название прибора, диапазон, цена. Сформировать новый файл, содержащий записи о тех приборах, которые есть в первом файле, но которых нет во втором.

19. Сформировать файл, имеющий следующую структуру

type дата=record

число:1..31;

анкета = record

фамилия: string;

пол:(м,ж);

день рождения: дата;

end;

и определить:

- фамилию самого старшего мужчины;

- все фамилии, начинающиеся с заданной буквы;

- список людей, родившихся в заданном месяце.

20. Сформировать файл, имеющий следующую структуру

type знакомый=record

фамилия:string;

номер_тел:10000..99999;

адрес: string;

end;

и определить:

- есть ли в книжке телефон данного человека;

- кому принадлежит данный телефон;

- список людей, живущих на данной улице.

21. Сформировать файл, имеющий следующую структуру

type студент= record фамилия: string;

номер гр: string;

оценка1: integer;

оценка2: integer;

оценка3: integer;

end;

и определить:

134

- фамилию того, кто лучше всех сдал экзамены;

- средний балл по данному предмету;

- список задолжников.

22. Сформировать файл, имеющий следующую структуру

type студент= record фамилия:string;

имя:string;

пол:(м,ж);

возраст:16..35;

курс:1..5;

end;

и определить:

- курс, на котором наибольший процент мужчин;

-самые распространенные женские и мужские имена;

-список студентов данного пола, данного курса.

23. Сформировать файл, имеющий следующую структуру

type пассажир = record фамилия: string;

имя:string;

номер рейса:string;

количество вещей: integer;

общий вес: integer;

end;

и определить:

- рейс с максимальным весом багажа;

- пассажира с наибольшим количеством вещей;

- вывести список пассажиров и информацию об их багаже, улетающих данным рейсом.

24. Сформировать файл, имеющий следующую структуру

type владелец = record фамилия: string;

адрес: string;

марка автомобиля: string;

рег. номер: string;

год выпуска:1900..2000;

end;

135

и определить:

-количество автомобилей каждой марки;

-владельца самого старого автомобиля;

-фамилии владельцев и номера автомобилей данной марки.

25. Сформировать файл, имеющий следующую структуру:

type ребенок = record фамилия: string;

адрес: string;

пол:(муж,жен);

количество дней посещения: integer;

end;

и определить:

- самого болеющего ребенка;

- кто больше болеет мальчики или девочки;

- список детей проживающих на данной улице.

26. Сформировать файл, имеющий следующую структуру

type книга = record автор: string;

название: string;

год издание: integer;

издательство: string;

количество страниц: integer;

end;

и определить:

- есть ли в библиотеке книги данного автора;

- найти книгу с наибольшим количеством страниц;

- найти названия книг данного автора, изданных с указанного года, в данном издательстве.

27. Сформировать файл, имеющий следующую структуру

type товар = record наименование: string;

страна: string;

объем партии: integer;

136

цена: integer;

end;

и определить:

- страну, в которую экспортируется товар на максимальную сумму;

- список стран, в которые экспортируется данный товар;

- найти товары, который имеет минимальный объем партии.

28. Сформировать файл, имеющий следующую структуру

type игрушка = record название: string;

цена: integer;

возраст1:1..16;

возраст2:1..16;

end;

и определить:

- название самой дорогой игрушки;

- список игрушек, которые подходят детям данного возраста;

- подобрать игрушки на данную сумму денег (все варианты).

29. Сформировать файл, имеющий следующую структуру

type игрушка = record название: string;

цена: integer;

цвет: string;

возраст1:1..16;

возраст2:1..16;

end;

и определить:

- название игрушек, цена которых не превышает данную и которые подходят детям данного возраста;

- найти самую дешевую игрушку данного названия;

- найти самый распространенный цвет игрушек.

30. Сформировать файл, имеющий следующую структуру:

137

type пассажир=record фамилия:string;

имя:string;

номер рейса:string;

количество вещей: integer;

общий вес: integer;

end;

и определить:

- число пассажиров, количество вещей которых превосходит среднее число вещей;

- пассажира с данным количеством вещей и не более данного веса;

- вывести информацию о количестве вещей и общем весе каждого рейса.

31. Сформировать файл, имеющий следующую структуру

type спортсмен = record фамилия: string;

страна: string;

рост:150..220;

вес:30..100;

год рождения: integer;

результат: integer;

end;

и определить:

- средний рост и вес спортсменов данной страны;

- найти лучшего спортсмена данной страны;

- список спортсменов данного возраста с результатом, не хуже данного.

32. Сформировать файл, имеющий следующую структуру

type спортсмен = record фамилия: string;

страна: string;

тренер: string;

год рождения: integer;

результат: integer;

end;

138

и определить:

- найти самого молодого спортсмена, занимающегося у данного тренера;

- найти лучшего тренера данной страны;

- список тренеров с указанием страны.

33. Сформировать файл, имеющий следующую структуру

type предмет = record название: string;

количество часов: integer;

преподаватель: string;

кафедра: string;

форма отчетности: (зачет, экзамен);

end;

и определить:

- преподавателя, у которого самое большое количество часов;

- список предметов, по которым сдают экзамен;

- кафедру и преподавателя, который ведет данный предмет.

34. В текстовом файле найти те предложения, которые заканчиваются одинаковыми словами.

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

36. За один просмотр файла , состоящего из вещественных чисел, без использования дополнительных файлов напечатать элементы файла в следующем порядке: сначала все числа, меньшие , затем – все числа из отрезка , и, наконец – все остальные числа, сохраняя исходный взаимный порядок в каждом из этих трех групп чисел ( и - заданные числа, ).

37. Содержимое текстового файла, разделенное на строки, переписать в текстовый файл , перенося при этом в

139

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

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

ЗАНЯТИЕ 8. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ