Основы программирования (947332), страница 35
Текст из файла (страница 35)
6.5). Компонентыфайла хранятся на диске во внутреннем (двоичном) формате и нумеруются с0. Если посмотреть такой файл любым текстовым редактором, то можно распознать только символьную информацию, на месте же чисел в файле будутрасполагаться пробелы или символы псевдографики.Указатель файлаКомпонентеМаркер конца файлаКомпонент 1 Компонент 2Компонент 3Компонент 4Рис. 6.5. Типизированный файл201Часть 1.
Основы алгоритмизации и процедурное программированиеДля работы с типизированными файлами используют специальные процедуры и функции.1. Процедура Read(Var /; с1, с2, ...,сп) - осуществляет чтение очередныхкомпонентов типизированного файла. Список переменных ввода содержитодну или несколько переменных того же типа, что и компоненты файла, разделенных запятыми.
Если файл исчерпан, обращение к процедуре вызываетошибку ввода-вывода.2. Процедура Write(Var f; cly с2у ...уСп) - осуществляет запись данных втипизированный файл. Список вывода содержит одно или более выраженийтого же типа, что и компоненты файла, разделенных запятыми.3. Процедура Seek(Var f; numcomp:word) ~ осуществляет установкууказателя файла на компонент файла с номером numcomp.4. Функция FileSize(Var f):longint - возвращает количество компонентфайла, указанного файловой переменной.
Может использоваться для установки на конец файла совместно с Seek():Seek(f, РПе512еф);,.,5. Функция FilePos(Var fi.iongint- возвращает порядковый номер компонента, который будет обрабатываться следующей операцией ввода-вывода.После открытия файла для чтения или записи указатель файла стоит вего начале и указывает на первый компонент, имеющий номер 0.
После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Поскольку длина каждой компоненты файла строго постоянна, помимопоследовательного возможно осуществление прямого доступа к компонентам файла. По той же причине, если требуется изменить компонент файла, тоне обязательно переписывать компоненты в другой файл, а достаточно установить указатель файла на изменяемый компонент и записать новый компонент на место старого.Добавление компонентов в конец файла выполняется в режиме чтения.Для этого указатель файла устанавливается на его конец (как показано выше), после чего все выводимые компоненты дописываются в конец файла.Добавление компонентов в середину или начало файла может выполняться следующим образом: определяем место, в которое должны быть добавлены элементы, все последующие компоненты переписываем во временный файл, вставляем новые компоненты и, наконец, дописываем в файл компоненты, переписанные во временный файл.Удаление компонент обычно требует перезаписи файла.Пример 6.3.
Разработать программу, создающую файл, компонентамикоторого являются символы, введенные с клавиатуры. Затем эта программадолжна изменять символы, записанные в файл, организовывать чтение символов из файла попеременно с начала и с конца (прямой доступ), находитьуказанный символ в файле и удалять его из файла.2026. Файловая система. ФайлыProgram ex;Varfyflifile of char; { две файловые переменные}chyVchar;j:longint;name:strmg[8];BeginWriteLnCВведите имя файла: *); ReadLn(name);{создание и открытие файла}Asslgn(f, name-^\dat^); {связываем файл с файловой переменной}ReWrite(f);{открываем файл для записи (создаем)}WriteLnCВводите символы или CTRL-Z:');{занесение записей в файл}while not EOF do {пока не введено CTRL-Z с клавиатуры}beginReadLn(ch); {вводим символ с клавиатуры}Write(fyCh); {записываем символ в файл}end;WriteLn;{последовательное чтение записей из файла}ReSet(P;{открываем файл для чтения}while not EOF(/) do{пока не достигнут конец файла}beginRead(f,ch);{читаем символ из файла}Write(cK ' ');{выводим символ на экран}end;WriteLn;{изменение записей в файле}ReSet(f);{открываем файл для чтения}while not EOF(f) do{пока не достигнут конец файла}beginRead(f,i);{читаем символ из файла}Write(i,' ');{выводим символ на экран}i:=chr(ord(i)+10); {изменяем символ}WriteLn(i);{выводим на экран измененный символ}Seek(fyFUePos(f)'l); {возвращаемся на один компонент}Write(fyi);{перезаписываем символ}end;WriteLn;{попеременное чтение записей с начала и конца файла}ReSet(f);{открываем файл для чтения}/•=0;{устанавливаем номер компонента равным 0}while not EOF(f) do{пока не достигнут конец файла}begin203Часть I, Основы алгоритмизации и процедурное программированиеRead(fJ); {читаем символ из начала файла}Write(i);{выводим символ на экран}Seek(fyFileSize(f)-FilePos(f)); {устанавливаем указательдля чтения из конца файла}Read(fyi); {читаем символ из конца файла}Wnte(i);{выводим символ на экран}j:=j+l:{увеличиваем номер компонента}Seek(fJ); {устанавливаем указатель на следующий отначала компонент}end;WriteLn;WriteLnCВведите символ для удаления: *); ReadLn(ch);{подготовка к удалению записей: переименование исходногофайла и открытие нового файла с тем же именем}Close(f);{закрываем файл}ReName(fyname-^\bak^); {переименовываем файл}ReSet(f);{открываем файл для чтения}Assign(fl,name+\dat');{связываем новый файл с переменной}ReWrite(fl);{открываем новый файл для записи}{удаление записей - перепись остающихся записей в другой файл}while not EOF(f) dobeginRead(fyi);{читаем символ из файла}ifiochthen Write(fJ,i); {если символ не подлежит удалению, тозаписываем его в новый файл}end;Erase(f);{удаляем старый файл, после закрытия в нем ничего неизменилось, поэтому повторно его можно не закрывать}{последовательное чтение записей из нового файла}ReSet(fl);{открываем новый файл для чтения}while not EOF(fl) dobeginRead(flyCh); {читаем из файла}Write(ch ' ');end;WriteLn;EndПример 6.4.
Разработать программу, которая создает файл, содержащийсписок фамилий и даты рождения. Осуществить поиск в этом файле датырождения по заданной фамилии.2046. Файловая система. ФайлыProgram ex;Type fam=record{тип запись «сведения о сотрудниках»}ff:string[20]; {фамилия}year:word;{год рождения}month:L.12;{месяц рождения}day:L,31{день рождения}end;Varf:file offam; {файловая переменная «файл сотрудников»}jbifam:п J: integer;fffistring;key;boolean;BeginAssign(f,'(udat'); {связываем файловую переменную с файлом}ReWrite(J);{открываем файл для записи}WriteLnCВведите данные или CTRL-Z);while not EOF do {цикл, пока не введено CTRL-Z}beginReadLn(/b.ff, fb.year, fb.month, fb.day); {вводим данные по полям,фамилию вводим в отдельной строке, так как вводстроки завершается нажатием клавиши Enter}Write(fjb); {заносим запись в файл как один компонент}end;Close(f);{закрываем файл}WriteLnCВведите фамилию');Readln(ffJ);key;=false;{устанавливаем признак «запись не найдена»}ReSet(f);{открываем файл для чтения}while (not EOF(f)) and (not key) do {пока не обнаружен конецфайла и не найдена запись}beginRead(fjb);{читаем запись из файла}iffbjf^fffthen{если фамилии совпадают, то}begin {выводим данные}WriteLnCJlama: \fb.year,fb.
month; 3,fb. day;3);key;=true; {устанавливаем признак «запись найдена»}end;end;if not key then{если признак не установлен}WriteLn('Hem данных ) ; {то выводим «нет данных»}Close(f); {закрываем файл}end,205Часть I. Основы алгоритмизации и процедурное программированиеСледует отметить, что любой текстовый файл может быть прочитан кактипизированный файл с компонентами типа CHAR. В этом случае необходимо учитывать, что маркер конца строки текстового файла рассматривается всимвольном представлении как последовательность из двух символов #13 и#10.Пример 6.5.
Разработать программу, которая открывает текстовый файлкак типизированный с компонентом типа CHAR и читает его по символу.Program charjextjile;Type ff=file of char; {новый тип - символьный файл}VarЛ/Л{файловая переменная типа файл символов}a:char;n,i: integer;Jhame,st:string[30];BeginWriteLn('Beedume имя файла');ReadLn(fname);Assign(ffname);{связываем файловую переменную с файлом}ReSet(f); {открыть текстовый файл как типизированный на чтение}while not EOF(f) do {пока не достигнут конец файла}beginSt-'';Read(f^a);{читаем символ}while (ао#13) and not EOF(f) do {до маркера конца строкиили конца файла}beginst:='st+a; {добавляем считанный символ в строку}Read(f,a);{читаем очередной символ}end;if not EOF(f) then Read(f,a); {пропускаем символ #10}WriteLn(st);{выводим сформированную строку}end;Closeif);EndЗадания для самопроверкиЗадание 1.
Разработайте программу, которая создает типизированный файл, содержащий сведения об импортируемых в Россию товарах: наименование товара,страна, поставляющая товар, и объем поставляемой партии. В сформированном файле определить товары, импортируемые из страны Р (вводимой с клавиатуры в процессе выполнения профаммы), а также объем партий.