merged document (820599), страница 4
Текст из файла (страница 4)
В текстовом файле задан набор строк , содержащих фамилию студента и несколькооценок вида отл, хор, удов и неуд. Количество оценок у студентов различное. Записать вдругой текстовый файл фамилии отличников. Учесть, что количество оценок у отличникадолжно быть равно наибольшему числу оценок в данном списке, т.е. если у какого-тостудента или студентов 6 оценок и в списке имеется студент, имеющий всего две оценки иони отл, то он не считается отличником.
Набор данных в текстовом файле рекомендуетсяосуществлять в кодировке CP866 или пользоваться латиницей. Вместе с программнымифайлами высылайте и исходный текстовый файл.Файловый тип.Типизированные файлы.Во всех ранее созданных программах исходная информация вводилась с клавиатуры, арезультаты выводились на экран. Такая ситуация допустима, если вводить и выводитьнеобходимо небольшое количество данных и программа выполняется достаточно быстро.В противном случае возникают проблемы. При большом объеме вводимой информациинабор данных на клавиатуре занимает много времени и требует особой внимательности, абольшой объем выводимых результатов потребует немедленного и полного анализа, чтоне всегда возможно. Поэтому любой язык программирования должен содержать средствадля организации хранения информации на ВЗУ и доступа к ней.
Как известно всяинформация на ВЗУ хранится в файлах. Под файлом понимают либо область памяти наВЗУ, способную хранить некоторую совокупность информации, либо логическоеустройство – потенциальный приемник или источник информации. В файл можнопоместить определенные данные или извлечь их из него. Эти действия называются вводом– выводом.Любой файл имеет три характерные особенности:1. у него имеется имя, что дает возможность программе работать одновременно снесколькими файлами;2. файл содержит компоненты одного типа. Типом может быть любой, кромефайлового;3. размер вновь создаваемого файла никак не оговариваются при его объявлении.Для организации работы с файлами в программе должны быть определены специальныепеременные файловых типов, которые считаются представителями файлов в программе.Использование таких переменных и отражает особенности файлов, т.е. предполагается,что файл представляет собой потенциально бесконечный список значений одного типа.Файловый тип можно задать таким образом:Type<имя>=File of <базовый тип>;TypFile=File of integer;Соответственно файловая переменная задается:Var f:TypFile;Это описание означает, что в программе под именем f понимается неопределенноеколичество целых чисел на внешнем носителе.С каждой файловой переменной связано понятие текущего указателя файла.
Его условноможно представить неявно описанную переменную (вместе с файловой), котораяуказывает на некоторый элемент файла.целоецелоецелоецелоеТекущийуказательВсе действия с файлом (чтение, запись) производится поэлементно, причем в этихдействиях участвует тот элемент, который обозначен текущим указателем. В результатесовершения операции текущий указатель перемещается, настраиваясь на тот или инойэлемент. Все положения текущего указателя считаются пронумерованными, начальноеположения имеет нулевой номер. В конце файла проставляется признак окончания файла.Примеры описания файловых переменных:TypePerson = RecordName:string[20];Year:word;End;TArr = Array [1..20] of real;VarF1:File of real;F2:File of Person;F3:File of TArr;Файлы становятся доступными программе только после выполнения особой операцииоткрытия файла.
Эта операция выполняется в два этапа. На первом осуществляетсясвязывание ранее описанной файловой переменной с именем существующего или вновьсоздаваемого файла. На втором - указывается: существует файл или должен создаваться.Первый этап реализуется вызовом процедуры AssignFile(<ф.п.>,<имя файла>);НапримерAssignFile(f1,’dan.dat’);илиConstName=’A:\dan.dat’; AssignFile(f1,name);илиVar name:string[12];BeginReadln(name);AssignFile(f1,name);На втором этапе, который часто называется открытием файла, осуществляется поискфайла на диске, образование специальных системных буферов для обмена с ним иустановление текущего указателя на его начало (в нулевую позицию).
Используется однаиз двух процедур: Reset(<ф.п.>); или Rewrite(<ф.п.>); В первом случаепредполагается, что файл уже существует. Если он по каким-то причинам отсутствует, товозникает исключительная ситуация и задание снимается с выполнения. Прииспользовании процедуры Rewrite() файл может отсутствовать на диске, в этом случаеона создает его. Если же файл уже существует, то она очищает его, т.е.
все егосодержимое будет уничтожено.По окончании работы файлы закрываются с использование процедурыCloseFile(<ф.п.>);Для выполнения операций ввода – вывода используются известные процедурыRead(<ф.п.>,<список ввода>),Write(<ф.п.>,<список ввода>). На первомместе обязательно стоит имя файловой переменной. Процедуры Readln() и Writeln()при работе с типизированными файлами не используются.Для работы с файлами часто используется логическая функция EOF(<ф.п.>),тестирующая признак конца файла. Возвращает True, если файловый указательнаходится в конце файла, т.е. достиг признака конца файла. При считывании информациииз файла это означает, что вся информация считана, т.е.
файл исчерпан.Пример: Создать файл, записав в него 20 вещественных чисел. Переписать из негоположительные числа в один в файл, а отрицательные числа – в другой.Program Exam;Procedure Createfile(fname:string);Var f: file of Real;X:real;i:integer;BeginAssignFile(f,fname);Rewrite(f);For i:=1 to 20 doBeginX:=random(50);Write(f,x);End;CloseFile(f);End;Procedure Viewfile(fname:string);Var f: file of Real;X:real;i:integer;BeginAssignFile(f,fname);Reset(f);While Not EOF(f) DoBeginRead(f,x);Writeln(x:4:0)End;End;Procedure Resultfile(fname,fplus,fminus:string);Var f,p,m: file of Real;X:real;i:integer;BeginAssignFile(f,fname);Reset(f);AssignFile(p,fplus);Rewrite(p);AssignFile(m,fminus);Rewrite(m);While Not EOF(f) DoBeginRead(f,x);If x<0 Then Write(m,x)Else Write(p,x);End;CloseFile(f); CloseFile(p); CloseFile(m);End;Var fsour,fresp,fresm:string[12];BeginWrite(’имя исх.файла’); Readln(fsour);Createfile(fsour);Viewfile(fsour);Write(’имя полож.файла’); Readln(fresp);Write(’имя отриц.файла’); Readln(fresm);Resultfile(fsour,fresp,fresm:string);Viewfile(fresp);Viewfile(fresmе);End.При создании файла его открытие осуществлялось процедурой Rewrite(f);, если послезаписи данных необходимо в той же процедуре считать данные, то файл должен бытьзакрыт и открыт уже как существующий процедурой Reset(f);, при этом связь междуфайловой переменной и файлом сохраняется.
При считывании данных из файла длязавершения цикла использовался признак конца файла. В данном примере во всехпроцедурах через параметры передавались имена файлов. Нередко через параметрыпередаются файловые переменные. В этих случаях такие параметры должныспецифицироваться как параметры – переменные, т.е. перед их именами должноприсутствовать служебное слово Var. Следует также отметить, что созданиетипизированных файлов и просмотр их содержимого осуществляется толькопрограммным путем.Закрывать файлы надо обязательно, особенно, если они создаются. Дело в том, чтоинформация записывается в файл не напрямую, а через специальные системные буферы,которые полностью очищаются только при закрытии файла, т.е.
если не закрыть файл, точасть информации останется в буфере и в файл не попадет.realrealrealНач.положениеуказателя=0realКонечное положение ук-ляFileSize(f)В рассмотренном примере запись и считывание данных выполнялась последовательночерез одну буферную переменную x. При открытии файла файловый указательавтоматически устанавливается в начальное положение (0). При считывании или записион автоматически передвигается на одну позицию, всегда находясь перед темкомпонентом, который будет участвовать в последующей операции ввода – вывода.Поскольку тип компонентов файла определен при его описании, размер файла на дискетоже известен, то и количество элементов файла может быть определено.
Это можносделать с помощью функции FileSize(<ф.п.>)целого типа. При необходимостипомимо последовательного способа доступа к данным (который был реализован врассмотренном примере) в типизированных файлах можно осуществлять и прямой доступк нужному компоненту файла. Для этого предусмотрена процедураSeek(<ф.п.>,<номер положения ф.ук-ля>). На втором месте указываетсяномер положения файлового указателя, который может меняться в диапазоне от 0 дозначения FileSize(), т.е. Seek(f,0) устанавливает файловый указатель в началофайла, Seek(f,FileSize(f)) – в конец файла.Функция FilePos(<ф.п.>) возвращает номер текущего положения файловогоуказателя.
Например, Seek(f,FilePos(f)+1)позволяет пропустить один элемент.Кроме перечисленных подпрограмм, используется еще процедура Truncate(<ф.п.>),которая удаляет хвостовую часть файла, начиная с текущего положения файловогоуказателя. Применяя эти процедуры и функции, можно организовать достаточно сложныеалгоритмы обработки информации в файле без полного ее считывания в оперативнуюпамять.Пример: В файле вещественных чисел поменять местами первый элемент с последним.Procedure Editfile(fname:string);Var f: file of Real;X,y:real;BeginAssignFile(f,fname);Reset(f);Read(f,x);Seek(f,FileSize(f)-1);Read(f,y);Seek(f,0);Write(f,y);Seek(f,FileSize(f)-1);Write(f,x);CloseFile(f);End.Рассмотрим некоторые типовые задачи на обработку данных в типизированных файлах сиспользованием прямого доступа к элементам файла.1.Записать в типизированный файл произвольное количество вещественных чисел.Поставить после компонента с максимальным значением новый компонент с заданнымзначением .program project1;procedure Createfile(namefile:string);Varf : File of Real;x:real; i,n:integer;beginn:=random(10)+5;Assignfile (f,namefile);ReWrite (f);For i := 1 To n Dobeginx := Random(20) + Random;Write (f,x);end;Closefile (f);end;procedure Viewfile(namefile:string);Varf : File of Real;x:real;beginAssignfile (f,namefile);Reset (f);While not Eof(f) DobeginRead(f,x);Writeln (x:5:2);end;Closefile (f);end;procedure InsInfile(namefile:string;xins:real);Varf : File of Real;x,xmax:real;i,imax,n,j : integer;beginAssignfile (f,namefile);Reset (f);n:= filesize(f);Read (f,xmax); imax := 1;For i := 2 To n DobeginRead (f,x);If x > xmax Thenbeginxmax := x;imax := i;end;end;For i := n DownTo imax+1 DobeginSeek (f,i-1);Read (f,x); Write (f,x);end;Seek (f,imax);Write (f,xins);Closefile (f);end;Varnf:string;xins:real;Beginnf:= 'ff.dat';Createfile(nf);Writeln ('Содержимое файла');Viewfile(nf);Write ('Введите вставляемое значение'); Readln(xins);InsInfile(nf,xins);Writeln ('Содержимое файла');Viewfile(nf);readln;end.2.