Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Подпрограммы, работающие со строкамиСодержание книги
Поиск на нашем сайте
Рассмотрим лишь некоторые подпрограммы. Они имеются во всех рассматриваемых версиях Паскаля. Функции CONCAT(S1,S2,...,SN)- функция типа STRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметров S1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +. COPY(ST,INDEX,COUNT)- функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером INDEX. LENGTH(ST)- функция типа INTEGER; возвращает длину строки ST. P OS(SUBST,ST)- функция типа INTEGER; отыскивает в строке ST первое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль. Процедуры DELETE(ST,INDEX,COUNT)-удаление COUNT символов из строки ST, начиная с символа с номером INDEX. INSERT(SUBST, ST, INDEX) - вставка подстроки SUBST в строку ST, начиная с символа с номером INDEX. STR(X[:WIDTH[:DECIMALS]],ST) -преобразование значения типа REAL или INTEGER в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования (WIDTH - длину числа, DECIMALS - длину дробной части; параметр DECIMAL имеет смысл указывать только для вещественных чисел). VAL(ST, X, CODE) - преобразование строки ST во внутреннее представление целого или вещественного числа Х; параметр CODE содержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строке ST, где обнаружен ошибочный символ; пробелы перед числом в строке ST должны отсутствовать. Одной из практически важных задач, решаемых с помощью строковых типов, является задача обработки данных сложной структуры. Эти данные часто собраны в таблицу. Строка таблицы соотвествует некоторому объекту исследования: товару, человеку, предприятию. Строка, несмотря на то, что состоит из символов, содержит смысловые данные разного типа; например, наименование товара имеет символьный тип, его стоимость – вещественный, и т. д. Для обработки такой строки необходимо выделить ее смысловые поля-подстроки (с помощью функции COPY), перевести некоторые поля из символьного представления в числовое (с помощью процедуры VAL). Затем, возможно, потребуется проанализировать символьные поля с помощью функции POS и подготовить строку выходных данных с помощью STR и CONCAT. Ниже рассматривается пример такой задачи. Пример. Сведения об игрушках представлены в виде таблицы:
Последняя строка таблицы не относится к исходным данным, в ней задается ширина столбцов в символах без учета разделителей между столбцами. Определить самый дорогой конструктор для детей в возрасте до семи лет и его стоимость. Program Primer3_1_3; VAR N:Integer;{число строк таблицы} TABL:String[60];{строка таблицы–содержимое столбцов +5 разделителей} nu:String[2]; {подстрока-номер игрушки} name:String[29]; {подстрока-название игрушки} MinAge,MaxAge,Rub:String[8]; {подстроки: мин. и макс. возраст,цена} max:Real; {максимальная стоимость конструктора} MaxAR,RubR:Real;{макс.возраст и стоимость в веществен. представлении} namemax:String[29];{название конструктора с максимальной ценой} i {счетчик игрушек}, C {номер ошибочного символа при преобразовании строки в число}:Integer; BEGIN Writeln(' Введите число наименований игpушек'); ReadLn(N); max:=0; Writeln('Вводите сведения об игpушках в виде таблицы'); Writeln( '┌─┬─────────────┬─────┬─────┬────┐'); Writeln( '|N | название игpушки | миним. | макс. | стои- |'); Writeln( '| | | возpаст |возpаст |мость |’); Writeln( '├─┼─────────────┼─────┼─────┼────┤'); For i:=1 to N Do BEGIN Readln(TABL); name:=Copy(TABL,5,29); {выделение подстрок названия} MaxAge:=Copy(TABL,44,8); {и максимального возраста} Val(MaxAge,MaxAR,C); {преобразование строка - число } If C<>0 Then Writeln(' ошибка в',C,'-й позиции MaxAge') Else Begin If ((Pos('констpуктоp',name)>0) or {входит ли в название} (Pos('Констpуктоp',name)>0)) and {слово "конструктор"} (MaxAR<=7) Then Begin Rub:=Copy(Tabl,53,8); {выделение подстроки цены} Val(Rub,RubR,C); {преобразование строка-число} If C<>0 Then Writeln(' ошибка в',C,'-й позиции Rub') Else Begin If RubR>max Then {определение текущего значения} BEGIN {максимальной цены} max:=RubR; namemax:=name{запомнили конмтруктор с макс. ценой} END; End End End END; If max=0 Then WriteLn(' Констpуктоpов для детей до семи лет нет') Else BEGIN WriteLn('Cамый доpогой констpуктоp для детей до семи лет'); STR(max:6:2,Rub);{перевод max в строку} WriteLn(CONCAT(namemax, ' стоит ',Rub, ‘ рублей’); END; END. При обработке таблиц большого объема эта программа имеет, по крайней мере, два недостатка: 1) количество строк таблицы задается вводом (но ручной подсчет количества строк таблицы – это достаточно большой труд); 2) ввод данных происходит с экрана, хотя, конечно, лучше хранить данные в файле на внешнем носителе и осуществлять ввод из файла. Эти недостатки можно устранить, используя тип файл (см. §3.3). Тип запись Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись. Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называются полями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя. Описание типа запись: TYPE имя_типа = RECORD список_1_имен_полей: тип_1; список_2_имен_полей: тип_2; ... список_N_имен_полей: тип_N; END;
Например: TYPE COMPLEX=RECORD{значения переменныx этого типа - Re,Im:REAL {действительная и мнимая части} END; DATE = RECORD {для описания дат (число, месяц, год)} Day: 1..31; {число} Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц} Year: Integer; {год} END; BOOK = RECORD {для описания книг в каталоге библиотеки} Author,Title,Publisher:String; {автор, название, издательство} Year,Volume,Pages:Integer; {год издания,том,количество страниц} END; Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип). Для обращения к полю записи надо указать имя записи, а затем, через точку, имя поля. Например: VAR C:COMPLEX; D,D1:DATE; B:BOOK; BEGIN... C.Re:=5; D.Month:=January; B.Author:='Smith'; {*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*}... Чтобы не писать многократно имя записи при работе с ее полями, используется оператор WITH Имя_записи DO оператор Три оператора, ограниченные {*}, эквивалентны оператору: WITH D1 DO BEGIN Day:=6; Month:=June; Year:=1799 END; Пример. Ниже приведена программа для задачи §3.1.3, использующая для отображения строки таблицы тип запись (вместо типа строка) Program Toys; TYPE SVED=RECORD {тип "запись", описывающий игрушку} name:String; {название игрушки} MinAge, MaxAge,Rub:Real; {возрастные границы и стоимость} END; VAR N:Integer; {число наименований игрушек} Toy:SVED; {переменная, описывающая игрушку} max:Real; {максимальная стоимость конструктора для детей до 7 лет} namemax:String; {название искомого конструктора} i:Integer; {счетчик наименований игрушек} BEGIN Writeln(' Введите число наименований игpушек'); ReadLn(N); max:=0; For i:=1 to N Do With Toy Do {работаем с полями записи Toy} BEGIN Writeln('Введите название игpушки с номером', i:2); Readln(name); Writeln('Введите мин. и макс. возраст и стоимость'); Readln(Minage,Maxage,Rub); {вводим запись по полям} If ((Pos('констpуктоp',name)>0) or {содержит ли название} (Pos('Констpуктоp',name)>0)) and {слово "конструктор" } (MaxAge<=7) Then If Rub>max Then BEGIN max:=Rub; namemax:=name END; END; If max=0 Then WriteLn(' Констpуктоpов для детей до семи лет нет') Else BEGIN WriteLn('Cамый доpогой констpуктоp для детей до семи лет'); WriteLn(namemax); WriteLn('стоит ', max:6:0, ' pублей') END; END. Замечания: 1. Программа, использующая запись, конечно, алгоритмически проще, чем программа со строками. Платой за упрощение является разрушение структуры таблицы при вводе: строка таблицы распределяется по нескольким строкам экрана монитора компьютера. 2. Недостатки программы, отмеченные в §3.1.3, имеют место и для этой программы. Они устраняются использованием файлов. Файлы Общие понятия Термин файл используется в программировании в двух смыслах. В рамках операционной системы файл понимается как область памяти внешнего запоминающего устройства (обычно диска), имеющая имя. В алгоритмических языках файл - это тип данных, используемый, как правило, при работе с внешними запоминающими устройствами. В этой главе мы будем рассматривать файл как тип данных. Файл - это последовательность однотипных компонент. Число компонент файла не ограничено. После последней компоненты файла стоит специальный код, называемый признаком конца файла; этот код обычно ставится автоматически, без участия программиста. В классическом понимании файл рассматривается как абстрактное обобщение данных на устройстве с последовательным доступом, типичным представителем которого является магнитная лента. В библиотеках современных языков программирования, конечно, имеются средства и для работы с файлами прямого доступа. Условно устройство с последовательным доступом можно представить как бесконечную ленту с фиксированным началом. Движение по этой ленте возможно только от начала, последовательно от компоненты к компоненте. Для достижения N -й компоненты необходимо пройти (N-1) предыдущих компонент. В оперативной памяти ЭВМ для каждого файла существует единственная ячейка, в которую информация может считываться из файла или из которой информация может записываться в файл; эта ячейка рассчитана точно на одну компоненту файла; она называется буфером (или окном, карманом). Используется также термин указатель файла. Это абстрактное понятие, соответствующее головке считывания-записи магнитной ленты или магнитного диска. Указатель стоит (указывает) на доступной (в каждый момент единственной!) компоненте файла. Обычно в алгоритмических языках определяется программное и физическое имя файлов. Программное имя - это имя переменной файлового типа, физическое имя - это имя устройства или файла на диске. Существуют специальные операторы, связывающие программное и физическое имя файла. Файлы бывают текстовыми и двоичными. Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении. Текстовые файлы можно подготовить, прочитать, исправить с помощью текстового редактора. Они хранят информацию во внешнем представлении, в виде, понятном для человека. Такие файлы часто называются видимыми. Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования. В Турбо Паскале рассматривается два вида двоичных файлов: типизированные и нетипизированные. В случае типизированных файлов байты файла разбиваются на ячейки в соответствии с типом компонент файла; например, для файла с базовым типом integer каждая пара байтов (для 32-разрядных компьютеров – четверка) рассматривается как целое значение; типизированные файлы хранят данные во внутреннем представлении. Для нетипизированных файлов представление информации безразлично, файл рассматривается как последовательность нулей и единиц. Ниже рассматривается подход к файлам версии Турбо Паскаль. Объектный Паскаль поддерживает этот подход, хотя имеет и другие широкие возможности для работы с файлами, характерные для операционной среды Windows; рассмотрение последних возможностей выходит за рамки данного пособия. Файлы в Турбо Паскале Файлы бывают текстовые, типизированные и нетипизированные. Функция EOF [20](имя_файла) применяется к файлам любого вида. Она возвращает значение TRUE при чтении конца файла, иначе возвращает FALSE. Все процедуры, использующие файлы, не работают без других, подготовительных, процедур: ASSIGN [21], RESET, REWRITE. Процедура ASSIGN связывает программное имя файла (т.е. имя переменной, описанной как файл) и его физическое имя (т.е. имя файла на диске или имя устройства, записанное по правилам операционной системы). Обращение к процедуре имеет вид: ASSIGN (програм_имя_файла, физич_имя_файла). Процедура RESET (имя файла) подготавливает файл к чтению (вводу). В случае отсутствия файла с заданным физическим именем процедура выводит сообщение об ошибке. В случае существования файла производятся следующие действия. Если файл не пустой, то указатель устанавливается на первую компоненту, значение первой компоненты пересылается в буфер, функция EOF принимает значение FALSE. Если файл пуст, то содержимое буфера считается неопределенным, а функция EOF устанавливается в значение TRUE. Процедура REWRITE (имя_файла) подготавливает файл к записи (выводу). Если файл с заданным физическим именем не существует, то делается попытка создать файл. Далее файл очищается; указатель устанавливается на первую компоненту; функция EOF принимает значение TRUE. RESET и REWRITE называются процедурами открытия файла (для чтения и записи, соответственно). Процедура APPEND (имя_файла) открывает текстовый файл для дополнения. После окончания работы с файлом необходимо его закрыть с помощью процедуры CLOSE [22] (имя_ файла). Под закрытием файла понимается его сохранение и перерегистрация в каталоге. Кроме того, в результате закрытия файла разрушается связь между программным и физическим именами файла, определенная оператором ASSIGN; использование программного имени файла становится невозможным (до повторного применения ASSIGN и открытия файла). Текстовые файлы Для описания переменной типа текстовый файл используется ключевое слово TEXT [23]: VAR имя_текст-файла: TEXT;... Процедуры считывания из текстового файла (записи в него) отличаются от привычных процедур ввода с клавиатуры (вывода на экран) только тем, что в скобках перед списком ввода (вывода) указывается имя файла: READ (имя-файла, список_ввода); WRITE (имя_файла, список_вывода) READLN (имя_файла, список_ввода); WRITELN (имя_файла, список_вывода) Если имя файла отсутствует, то используется имя CON. Функция EOLN [24](имя_файла) применима только к текстовым файлам (так же, как и процедуры READLN и WRITELN); она возвращает значение TRUE, если считан конец строки, иначе возвращает значение FALSE. Далее приведены программы, исходные и выходные данные которых хранятся в текстовых файлах. Пример 1 program Primer1_3_3_3; {В текстовом файле Х хранятся сведения об игрушках} {в текстовый файл Y записываются сведения} {о конструкторах для детей до 7 лет} Type sved=record name:string; minage,maxage:integer;rub:real; end; Var x,y:text; toy:sved; Begin Assign (x,'d:\student\xtext.txt'); Assign(y,'d:\student\ytext.txt'); {физические имена файлов выбраны произвольно} reset(x); rewrite(y);{x открывается для чтения, у - для записи} if eof(x) then writeln('x - пустой') else Begin while not eof(x) do with toy do Begin readln(x,name); {запись считывается по полям} readln(x,minage,maxage,rub); if((pos('конструктор',name)>0) or pos('конструктор',name)>0)) and (maxage<=7) then writeln(y,name); {запись выводится по полям} writeln(y,minage,maxage, rub:8:0); End; End; Close(x); Close(y); End. Пример 2 Program Primer2_3_3_3; {Сведения о багаже авиапассажира состоят из фамилии, имени, отчества, количества вещей, общего веса багажа и признака наличия фотоаппаратуры. Сведения хранятся в текстовом файле. Вывести в другой текстовый файл фамилии, имена, отчества пассажиров, имеющих фотоаппаратуру. Кроме того, вывести на экран число пассажиров, вес багажа которых превышает 20 кг, и число пассажиров, у которых средний вес одной вещи больше 15 кг.} Type Bagpas=Record {тип Bagpas - это запись, содержащая сведения о багаже одного пассажира} Fio:String; {ФИО пассажира} Kv: integer; {количество вещей пассажира} P:Real; {вес багажа} Foto:integer; {Foto=1, если фотоапаратура есть; Foto=0, в противном случае} End; Var Pas:Bagpas; {cведения о багаже одного пассажира} NameF:array [1..20] of string; {массив ФИО пассажиров, имеющих фото} Nf:integer; {число пассажиров, имеющих фото} N20:integer;{число пассажиров, вес багажа которых больше 20 кг} N15:Integer; { число пассажиров, у которых средний вес вещи больше 15 кг} i:Integer; { счетчик пассажиров} F,G:text; Begin Assign(F,'d:\student\bag'); Reset(F); Assign(G,'d:\student\fotores'); Rewrite(G); If eof (F) then Writeln (' Пуст файл исходных данных') Else Begin Nf:=0; N20:=0;N15:=0; While not eof(F) do With pas do Begin Readln(F,Fio); Readln(F,Kv); Readln(F, P); Readln(F,Foto); If Foto=1 then Begin Nf:=Nf+1; Writeln(G,Fio); End; If P>20 Then N20:= N20+1; If P/Kv>15 Then N15:=N15+1; End; If Nf=0 Then Writeln(' Пассажиров с фотоаппаратурой нет') Else Begin Writeln( ' Фамилии пассажиров с фотоаппаратурой в файле foto'); End; Writeln(' Багаж больше 20 кг у',N20:3,' пассажиров'); Writeln(' Cредний вес одной вещи больше 15 кг у', N15:3,' пассажиров'); End; Close(F); Close(G); End. Замечание. Текстовые файлы можно ввести в ЭВМ, прочитать, исправить с помощью текстового редактора. Типизированные файлы Описание типизированного файла: VAR Имя Файла: FILE OF Базовый Тип;... Базовый тип - любой, но не файл. Процедуры чтения из файла и записи в файл: READ (Имя Файла, Список Переменных) WRITE( Имя Файла, Список Переменных) Cписок переменных содержит переменные только базового типа. Операторы READLN и WRITELN не имеют смысла, так как компоненты файла не являются строками. Напомним, что типизированные файлы хранят данные во внутреннем представлении, поэтому их нельзя подготовить с помощью текстового редактора. Для записи значений в типизированный файл и чтения типизированного файла необходимо подготовить специальные программы, как показано в примере. Пример 1. Рассматриваются данные об игрушках из примеров §§3.1.3, 3.2, 3.3.3. Приведенные три программы должны работать последовательно друг за другом. program texttyp {пpеобpазование текст.файла в типизиpованный}; type sved=record name:string; minage,maxage:integer;rub:real; end; var xtext:text; x:file of sved; toy:sved; Begin Assign(xtext,'G:\valia\xtext'); Assign(x,'G:\valia\x'); {xtext готовится в текстовом редакторе, х получается программно} reset(xtext);rewrite(x); if eof(xtext) then writeln(' Исходный текстовый файл пуст') else Begin while not eof(xtext) do Begin with toy do Begin readln(xtext,name); readln(xtext,minage,maxage,rub); End; write(x,toy); End; End; Close(x); Close(xtext); End. program TypFile; {из типизированного файла х в типизиpован. файл y записываются } { сведения о констpуктоpах для детей до семи лет} Type sved=record name:string; minage,maxage:integer;rub:real; end; Var x,y:file of sved; toy:sved; Begin Assign (x,'g:\valia\x'); Assign(y,'g:\valia\y'); reset(x); rewrite(y); if eof(x) then writeln('x - пустой файл') else Begin while not eof(x) do Begin read(x,toy);{считывается запись полностью} with toy do if ((pos('констpуктоp',name)>0) or (pos('Констpуктоp',name)>0)) and (maxage<=7) then write(y,toy); End; End; Close(x); Close(y); End. program typtext; { перевод типизированного файла в текстовый} type sved=record name:string; minage,maxage:integer;rub:real; End; Var y:file of sved; ytext:text; toy:sved; Begin Assign(y,'G:\valia\y'); Assign(ytext,'G:\valia\ytext'); reset(y);rewrite(ytext); if eof(y) then writeln(' типизированный файл пуст') else Begin while not eof(y) do Begin read(y,toy); With toy do Begin writeln(ytext,name); writeln(ytext,minage,maxage,rub:7:0); End; End; End; Close(y); Close(ytext); End. Замечание. В типизированном файле все компоненты занимают одинаковое количество байтов памяти, поэтому можно определить адрес начального байта каждой компоненты по её номеру. Подпрограммы, использующие эту возможность, называются подпрограммами прямого доступа. Они приведены ниже. Функция FILESIZE (ИмяФайла) возвращает число компонент файла. Функция FILEPOS (ИмяФайла) возвращает номер компоненты, которая будет обрабатываться следующей процедурой ввода-вывода. Процедура SEEK (ИмяФайла, №компоненты) смещает указатель к требуемой компоненте. Компоненты файла нумеруются с нуля. Следовательно, оператор SEEK (ИмяФайла, FILESIZE (ИмяФайла)) переместит указатель к концу файла. В типизированный файл, открытый для чтения, допустимо производить запись. Пример 2. Приведенная ниже программа заменяет в типизированном файле целых чисел нулевые значения на значение a, задаваемое вводом. Для подготовки типизированного файла и его просмотра требуется написать программы, аналогичные TextTyp и TypText примера 1. program Project1; Var F:file of integer; a,b:integer; begin AssignFile(f, 'ftyp');{файл ftyp поготовлен с помощью} Reset(F); {специальной программы} If eof (F) then writeln (' File is empty') else Begin writeln('Input a'); readln(a); while not eof(F) do begin read(F,b); if b=0 then begin seek(F,filepos(F)-1);{возврат к компоненте, равной 0} write(F, a){замена нулевого значения на а} end end; CloseFile(F); writeln('end'); End; Readln end. Совет: не стоит использовать процедуры прямого доступа при последовательной записи или последовательном считывании компонент, это увеличит время работы программы. Нетипизированные файлы Описание нетипизированного файла: VAR ИмяФайла: FILE; Содержимое нетипизированного файла рассматривается системой программирования как последовательность байтов. Нетипизированный файл может содержать данные в любом представлении (внешнем, внутреннем). Ответственность за правильное использование данных несет программист. Нетипизированные файлы дают возможность организовать высокоскоростной обмен информацией. Процедуры открытия нетипизированного файла: RESET (ИмяФайла, РазмерЗаписиВбайтах) – для чтения, REWRITE (ИмяФайла, РазмерЗаписиВбайтах) – для записи. Запись – это минимальное количество передаваемых за одно обращение к устройству байтов. Размер записи по правилу умолчания равен 128. За одно обращение к устройству передается блок из N записей. Высокоскоростная передача данных получается, когда размер блока равен кластеру. Кластер – количество байтов, считываемых за один поворот диска. Типичный размер кластера – 512 или 1024. Процедуры чтения и записи для нетипизированного файла: BLOCKREAD (ИмяФайла, Буфер, N, NN) BLOCKWRITE (ИмяФайла, Буфер, N, NN), где буфер - переменная для считывания (записи) информации, NN - число считанных записей (NN<=N, строгое неравенство возможно для последнего блока). Пример. Процедура копирования файлов произвольного типа. Procedure Kopir(infile,outfile:string); Var f1,f2:file; Buf:array[1..Klaster] of Byte; i:word; {Klaster - глобальная константа, размер кластера} Begin assign(f1,infile); assign(f2,outfile); reset(f1,1); rewrite(f2,1); repeat BlockRead(f1,Buffer, Klaster,i); BlockWrite(f2,Buffer, Klaster,i) until eof(f1); close(f1); close(f2); End.
|
||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-07; просмотров: 158; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.137.244 (0.009 с.) |