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

Тема: Программирование с использованием текстовых файлов

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

Под файлом понимается именованная область внешней памяти или логическое устройство – потенциальный источник или приемник информации. Основное отличие внешней памяти ЭВМ от оперативной памяти – возможность сохранения информации при отключении ЭВМ. Информация сохраняется в виде файлов, доступ к которым поддерживает операционная система ЭВМ. Поддержка операционной системы состоит в том, что в ней имеются средства:

– создания файлов;

– уничтожения файлов;

– поиска файлов на внешнем носителе;

– чтения и записи из файлов и в файлы;

– открытия файлов;

– закрытия файлов;

– позиционирования файлов.

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

Любой файл в Паскале имеет три характерные особенности:

1) у файла есть имя, это дает возможность работать с несколькими файлами одновременно;

2) содержит компоненты одного типа (типом может быть любой тип, кроме файлового);

3) длина вновь создаваемого файла никак не ограничена при объявлении и ограничивается лишь емкостью внешних устройств памяти.

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

type

< имя > = file of < тип >;

< имя > = text;

< имя > = file;

где < имя > – имя файлового типа или файловой переменной (правильный идентификатор);

< тип > – любой тип языка Паскаль, кроме файлового.

Например, можно привести такие описания:

type student = record

mark:string(10);

fiz,mat,pr: integer;

end;

text1 = file of string[80];

var f1 : file of char;

f2 : text;

f4 : text1;

f3 : file of student;

f6 : file;

В зависимости от способа описания можно выделить текстовые (text) файлы, типизированные (file of) и нетипизированные (file). Вид файла определяет способ хранения информации в файле.

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

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

Каждой программе доступны два стандартных файла input (клавиатура) и output (экран). Это – текстовые файлы. Любые другие файлы становятся доступными после выполнения специальных процедур. Рассмотрим основные процедуры для работы с текстовыми файлами.

Связывание файловой переменной с именем файла осуществляется с помощью встроенной процедуры assign:

assign(<ф.п.>,<имя файла или лог.уст-во>)

Здесь <ф.п.> – переменная файлового типа;

<имя файла или лог. уст-ва> – текстовое выражение, содержащее имя файла или логического устройства. Если имя файла задается в виде пустой строки, например assign(f,''), то файловая переменная связывается со стандартным файлом input или output.

Процедура открытия файла для чтения:

reset (<ф.п.>);

<ф.п.> – файловая переменная.

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

Процедура открытия файла для записи:

rewrite(<ф.п.>);

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

Для чтения и записи информации из файла или в файл используются известные процедуры: read, readln и write, writeln в которых в качестве первого параметра выступает файловая переменная. Например:

Write(f,x1,x2,x3) – процедура записи в файл f компонентов x1,x2,x3. Процедура записывает выражения х1, х2, х3 (целого, вещественного, символьного, булевского или строкового типа) по одному в файл f, начиная с того места, куда был установлен указатель файла в момент обращения к процедуре write. Аналогично работают остальные процедуры ввода и вывода.

При заполнении файла после последней записи автоматически помещается специальный невидимый признак "конец файла" (end of file). Существует функция eof(f), проверяющая конец файла, связанного с файловой переменной f. Функция eof(f) возвращает значение true, если действительно встретился признак конец файла; пока это не произойдет значение eof(f) будет false.

Функция eoln(f) тестирует, встретился ли конец строки (end of line) в файле, связанном с файловой переменной f. При заполнении строки после последней записи автоматически помещается специальный признак конец строки. Функция eoln(f) возвращает значение true, если действительно встретился признак "конец строки". Этот признак формируется при нажатии клавиши "ввод".

Close(f) – процедура закрытия файла, связанного с файловой переменной f. Функции процедуры close выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы.

Процедура append(f) инициирует дозапись в ранее существовавший текстовый файл, связанный с файловой переменной f, для добавления новых строк в конец файла.

Алгоритм работы с файлами включает в себя следующие этапы:

- связывание файловой переменной с именем файла;

- открытие файла для чтения, или записи, или дозаписи;

- выполнение операций ввода-вывода;

- закрытие файла.

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

program pr1;

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

var f:text;{Файловая пеpеменная}

a:real;{Буфеpная пеpеменная}

k:integer;{Количество положительных компонент}

begin

assign(f,'f.dat');

reset(f); {Откpыть файл по чтению}

while not eof(f) do {Пока не конец файла}

begin

read(f,a);{Читаем число из файла}

if a>0 then k:=k+1; {Вычисляем количество положительных компонент}

if eoln(f) then readln(f);{Если конец стpоки, то пеpеводим указатель файла на следующую стpоку }

end;

writeln('k=',k);

end.

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

program pr2;

var oldf,newf:text;{Файловые пеpеменные для стаpого и нового файлов}

oldn,newn:string;{Стpоковые пеpеменные, для хранения имен нового и стаpого файлов}

line:string;{Буфеpная пеpеменная для хpанения кодиpуемой стpоки}

c:integer;{Пеpеменная цикла}

begin

writeln('Введите имя кодиpуемого файла');

readln(oldn);

writeln('Введите новое имя');

readln(newn);

assign(oldf,oldn);

assign(newf,newn);

reset(oldf); {Откpыть стаpый файл по чтению}

rewrite(newf); {Откpыть новый файл по записи}

while not eof(oldf) do

begin

readln(oldf,line);{Читаем стpоку из стаpого файла}

for c:=1 to length(line) do {Кодиpуем стpоку}

if ord(line[c])=255 then line[c]:=chr(0)

else

line[c]:=succ(line[c]);

writeln(newf,line); {Закодиpованную стpоку пишем в файл}

end;

close(oldf);

close(newf);

end.

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

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

program pr3;

type student = record

fam:string[10];

fiz,mat,prog:byte;

end;

var ved: student;{Буферная переменная для хранения данных о студенте}

k:integer;{Количество студентов в группе}

ss,{Средний балл каждого студента}

sg,{Средний балл группы студентов}

max:real;{Максимальный средний балл студента}

f4:text;{Файловая переменная}

maxfam:string[10]; {Фамилия студента с максимальным средним баллом}

begin

assign (f4,'f4.dat');

reset (f4);{Открыть файл по чтению}

sg:=0;k:=0;max:=0;

while not eof (f4) do {Пока не конец файла}

with ved do

begin

read (f4,fam); {Чтение файла}

readln (f4,fiz,mat,prog);

ss:=(fiz+mat+prog)/3; {Вычисляем средний балл каждого студента}

if ss>max then {Определяем фамилию студента}

begin { с максимальным средним баллом}

max:=ss;

maxfam:=fam;

end;

sg:=sg+ss;

k:=k+1

end;

sg:=sg/k;

writeln('Средний балл в группе=',sg);

writeln('Максимальный средний балл у студента', maxfam)

end.

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

Задания

1.Разработать программу согласно варианту задания.

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

1.2. Дан текстовый файл. Переписать в файл g все компоненты файла f с заменой в них символа '0' на символ '1' и наоборот.

1.3. Дан текстовый файл f. Получить самую длинную строку файла. Если в файле имеется несколько строк с наибольшей длиной, то получить одну из них и записать в новый файл.

1.4. Дан текстовый файл. Переписать компоненты файла f в файл g, вставляя в начало каждой строки по одному пробелу. Порядок компонент должен быть сохранен.

1.5. Даны текстовый файл и строка s. Записать в новый файл все строки файла f, содержащие в качестве фрагмента строку s.

1.6. Дан текстовый файл f. Исключить пробелы, стоящие в концах его строк. Результат поместить в файл f1.

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

фамилия имя отчество

фамилия имя отчество

...

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

фамилия и.о.

фамилия и.о.

...

1.8. Пусть дан текстовый файл. Вывести строку с заданным номером в новый файл.

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

1.10. Пусть дан текстовый файл. Определить, сколько строк файла имеют длину, большую, чем заданное значение k и вывести эти строки в новый файл.

1.11. Пусть дан текстовый файл. Определить, сколько строк файла имеют длину, меньшую, чем заданное значение k и вывести эти строки в новый файл.

1.12. Пусть дан текстовый файл. Определить, сколько строк файла имеют длину, равную заданному значению k и вывести эти строки в новый файл.

2.Разработать программу согласно варианту задания.

2.1 Дан текстовый файл с данными о нагрузке преподавателей: фамилия преподавателя, предмет, часы. Вывести на экран информацию о нагрузке. Определить у какого преподавателя самая большая нагрузка и кого самая низкая и вывести в текстовый файл.

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

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

2.4. Дан текстовый файл с информацией о вступительном тестировании: абитуриент, баллы по первому предмету, баллы по второму предмету, баллы по третьему предмету. Абитуриенты сдавали три предмета, для поступления необходимо набрать 180 баллов. Вывести список абитуриентов на экран. Вывести в текстовый файл список абитуриентов, зачисленных в университет.

2.5. Дан текстовый файл с оценками за сессию в группе: фамилия студента, предмет1, оценка по предмету1, предмет2, оценка по предмету2). Вывести информацию об оценках за сессию на экран. Вывести в текстовый файл список неуспевающих (оценка по одному из предметов менее 4 баллов).

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

2.7. Дан текстовый файл с карточками читателей: фамилия, название книги, дата заказа, дата выдачи книги. Вывести на экран карточки читателей. Вывести текстовые файлы карточку каждого читателя отдельно.

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

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

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

2.11. Дан текстовый файл с расписанием: предмет, преподаватель, номер группы, день недели, время, аудитория. Вывести на экран расписание. Вывести в текстовый файл расписание введенной пользователем группы.

2.12. Дан текстовый файл с жителями городов: фамилия, город, улица, дом, квартира. Вывести на экран список жителей. Вывести в текстовый файл фамилии жителей, проживающих в разных городах по одинаковому адресу.

Наши рекомендации