9790

Файлы. Файловые переменные и типы

Реферат

Информатика, кибернетика и программирование

Файлы В языке Pascal под ФАЙЛОМ понимается область памяти на внешнем запоминающем устройстве, способная хранить некоторую совокупность информации. В эту область внешней памяти можно как поместить определенные данные, так и извлечь их из нее. Эти де...

Русский

2013-03-17

102.5 KB

31 чел.

Файлы

В языке Pascal под ФАЙЛОМ понимается область памяти на внешнем запоминающем устройстве, способная хранить некоторую совокупность информации. В эту область внешней памяти можно как поместить определенные данные, так и извлечь их из нее. Эти действия имеют общее название ввод-вывод.

Файловые переменные и типы

Для организации работы по вводу-выводу в программе могут быть определены специальные переменные файловых типов, которые считаются ПРЕДСТАВИТЕЛЯМИ файлов в Pascal-программе. Использование переменных файловых типов предполагает интерпретацию файла как потенциально бесконечного списка значений одного и того же (базового) типа. Например, описание переменной вида

var F : file of integer;

понимается как определение в программе под именем F списка неопределенного количества целых чисел, расположенного на некотором внешнем запоминающем устройстве (например, на магнитном диске). С каждой переменной файлового типа также связано понятие ТЕКУЩЕГО УКАЗАТЕЛЯ файла. Текущий указатель можно понимать как скрытую переменную (то есть неявно описанную вместе с файловой переменной), которая обозначает ("указывает" на) некоторый конкретный элемент файла. Таким образом, можно графически представить интерпретацию файла, связанного с переменной F, так:

Как правило, все действия с файлом (чтение из файла, запись в файл) производятся поэлементно, причем в этих действиях участвует тот элемент файла, который обозначается текущим указателем. В результате совершения операций текущий указатель может перемещаться, настраиваясь на тот или иной элемент файла. Все элементы файла считаются пронумерованными; начальный элемент имеет НУЛЕВОЙ номер.

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

Итак, файловый тип задается в программе с помощью служебных слов file и of, за которыми следует тип элементов файла (базовый тип). Базовый тип может быть любым типом, кроме файлового; кроме того, в качестве базового типа не допускается комбинированный тип, одним из полей которого является файл.

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

Файловый тип

Заметим, что Turbo Pascal допускает определение так называемых бестиповых файлов, для которых тип компонент не устанавливается. Бестиповые файлы будут рассмотрены далее.

Примеры описаний файловых типов и переменных:

type

Sequence = file of char;

var

F1, F2 : Sequence;

Table : file of string[80];

InputData : file of real;

Операции над файлами

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

Операции с файловыми переменными в Turbo Pascal'e можно разбить на четыре основные группы:

• установочные и завершающие операции;

• собственно ввод-вывод;

• перемещения по файлу;

• специальные операции.

Установочные и завершающие операции

В эту группу входят четыре операции, реализованные в виде стандартных процедур со следующими именами:

Assign

Reset

Rewrite

Flush

Close

Рассмотрим эти операции.

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

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

Пример:

Assign(F,'d:\mydir\myfile.dta');

После выполнения данного вызова файловая переменная F будет связана с дисковым файлом myfile.dta, расположенным в каталоге mydir из корневого каталога диска d. Второй параметр процедуры Assign может быть также строкой, содержащей условное обозначение "псевдофайлов" MS-DOS, то есть файлов, связанных с конкретным физическим устройством. Допускаются следующие имена, в основном совпадающие с принятыми в MS-DOS обозначениями:

CON - консоль, то есть для случая вывода информация помещается на экран дисплея, а в случае ввода информация воспринимается с клавиатуры;

LPT1, LPT2, LPT3 - печатающие устройства (допускается одновременно до трех устройств). Эти устройства предназначены только для вывода информации;

PRN - синоним LPT1;

 СОМ1, COM2 - последовательные коммуникационные порты. Смысл этих псевдофайлов определяется конкретными устройствами, подключенными к этим портам;

AUX - синоним СОМ1;

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

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

Разница между этими двумя процедурами заключается в начальных действиях с файлом. Процедура Reset предполагает, что открываемый дисковый файл уже существует, в противном случае возникает ошибка. Процедура Rewrite допускает, что открываемый файл может еще не существовать; в этом случае она создает заданный файл. Если же файл существует, то Rewrite ОЧИЩАЕТ его. Повторим, что в обоих случаях текущий указатель файла устанавливается на его нулевой элемент.

в) Процедура Flush (параметр - файловая переменная) используется для завершения обменов с файлом без его закрытия. Обмены с файлами всегда реализуются через некоторый буфер в оперативной памяти, поэтому в процессе записи на файл последние записываемые элементы могут еще находиться ("застрять") в буфере. Процедура Flush вызывает принудительный сброс этих элементов в файл. Эта процедура имеет смысл в том случае, если с файлом проводились операции записи, и используется редко, так как процедура Close (см. далее) производит такие же действия.

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

Операции ввода-вывода

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

Read

Write

В отличие от многих других процедур, Read и Write могут вызываться с РАЗЛИЧНЫМ ЧИСЛОМ ПАРАМЕТРОВ, и эти параметры могут иметь РАЗЛИЧНЫЕ ТИПЫ.

Процедура Read предназначена для чтения значений из файла в программу. Первым параметром должно быть имя файловой переменной, к которой была применена одна из операций открытия (Reset или Rewrite). Далее должны следовать переменные, в которые будут помещаться читаемые из файла значения. Тип этих переменных должен совпадать с базовым типом файла из первого параметра.

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

Если в процессе выполнения процедуры Read текущий указатель файла будет установлен на позицию, не содержащую информации (то есть будет достигнут конец файла), то чтение будет прекращено, процедура Read завершится преждевременно, и возникнет ситуация "конец файла". Возникновение этой ситуации можно проверить с помощью встроенной функции EoF (см. след. раздел).

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

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

Перемещения по файлу

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

Seek

Truncate

и три дополнительные функции

FileSize

FilePos

EOF

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

После выполнения процедуры Seek дальнейшие операции чтения или записи будут проводиться, начиная с установленной позиции указателя.

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

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

Seek(F,FilePos(F)+l) { пропуск одного элемента }

Seek(F,0) { установка указателя на начало файла }

Seek(F, FileSize (F)) { установка текущего указателя непосредственно за последним элементом файла; это может служить исходной позицией для добавления элементов в "хвост" файла }

Функция EoF вызывается с одним параметром - файловой переменной - и возвращает логическое значение true или false в зависимости от того, достигнут ли конец файла. Если файл использовался для чтения, то возникновение ситуации "конец файла" (и, соответственно, значение true, возвращаемое функцией EoF) означает, что все элементы файла прочитаны. При записи в файл истинность функции EoF будет означать, что очередная операция записи поместит информацию в конец данного файла.

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

Специальные операции

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

Erase - удаление файла на диске Rename -переименование файла ChDir - установить текущий каталог MkDir - создать новый (под)каталог RmDir - удалить пустой (под)каталог

Обработка ошибок ввода-вывода

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

В программе на языке Turbo Pascal установлены следующие правила обработки ошибочных ситуаций, связанных с вводом-выводом. По умолчанию при выполнении любой такой операции автоматически производится проверка на возникновение ошибки. При обнаружении ошибки выполнение программы прекращается, а на экран дисплея выводится краткое диагностическое сообщение, содержащее условный номер ошибки.

Наряду с такой стандартной формой реакции на ошибки, в системе имеется возможность предусмотреть собственную реакцию на ошибочные ситуации в самой программе. Для этого необходимо в начале "опасного" фрагмента программы отключить автоматическую проверку на возникновение ошибки. Это делается внесением директивы компилятора {$I-}. В этом случае возникновение ошибки при выполнении программы не будет приводить к немедленному ее завершению; вместо этого код (условный номер) возникшей ошибки будет запомнен системой. Посредством стандартной функции IOResult без параметров можно получить этот код и построить дальнейшие действия в зависимости от его значения, например:

Assign (F, 'с : \myfile') ;

{$I-} { отключаем автоматический контроль }

Reset(F);

{$I+) { включаем автоматический контроль}

if  IOResult <> 0 then { возникла ошибка! }

  Write('Ошибка при открытии файла');

В случае использования функции IOResult нужно твердо помнить следующую особенность: если отключен режим автоматического контроля (сработала директива {$I-}), то после возникновения ошибки все последующие операции С ЛЮБЫМ ФАЙЛОМ будут игнорироваться, пока не произойдет обращение к функции IOResult. Поэтому хорошим правилом является вызов функции и анализ кода ошибки СРАЗУ ПОСЛЕ выполнения операции, связанной с файлом. Кроме того, следует помнить, что вызов функции IOResult, возвращая в программу код ошибки, ОБНУЛЯЕТ этот код, поэтому последующие обращения к этой функции будут всегда давать нулевой результат, пока какая-либо файловая операция не закончится аварийно.

Считается, что при успешном выполнении операции обращение к IOResult дает в результате 0; ненулевой результат свидетельствует о возникшей ошибке. При необходимости можно провести более детальный анализ кода ошибки, например:

Assign(F,'с:\myfile') ;

{$I-} { отключаем автоматический контроль }

Reset(F);

Code : = IOResult; { получили код результата }

if Code <> 0 then begin { возникла ошибка! }

Write('Ошибка при открытии файла: ');

case Code of

1 : Write('Файл не найден');

3 : Write ('Маршрут не найден');

4 : Write('Слишком много открытых файлов');

5 : Write('Запрет доступа к файлу');

12 : Write('Некорректный код доступа к файлам')

else

end;

{$I+} { включаем автоматический контроль }

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

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

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

Структура текстовых файлов отличается от структуры обычных файлов (линейная последовательность элементов одного типа) тем, что содержимое текстового файла рассматривается как последовательность символьных строк переменной длины, разделенных специальной комбинацией, называемой "конец строки. Как правило, эта комбинация строится из управляющего кода перевод каретки" (символ #13), за которой, возможно, следует управляющий код "перевод строки" (символ #10). Текстовый файл завершается специальным кодом "конец файла" (символ #26). (Заметим, что в большинстве случаев знание конкретной кодировки управляющих символов необязательно ввиду наличия файловых операций, автоматически учитывающих эти символы).

Описанная структура текстовых файлов в языке Pascal хорошо согласуется с интуитивно понимаемым построением текстовой информации и полностью совпадает со стандартной структурой текстов, принятой в MS-DOS.

Представителем текстового файла в Pascal-программе является переменная файлового типа, которая должна быть описана с указанием стандартного типа text:

var TextInf : text;

Заметим, что слово text считается идентификатором стандартного типа, наряду с идентификаторами integer, real и т.п.

Работа с текстовыми файлами организуется построчно, причем характер чтения и записи является строго последовательным. Кроме того, для одного текстового файла НЕЛЬЗЯ одновременно производить операции и ввода, и вывода.

Набор операций, применимых к текстовым файлам, содержит, кроме начальных и завершающих операций и операций ввода-вывода, имеющихся для обычных файлов, еще и ряд специальных операций. Список операций над текстовыми файлами, определенных в Turbo Pascal'e, приведен ниже.

1. Начальные и завершающие операции. Для текстовых файлов применимы те же самые операции инициализации, открытия и закрытия, что и для обычных файлов. Так, процедура Assign задает связь файловой переменной с конкретным дисковым файлом; процедуры Reset и Rewrite используются для открытия файлов, а процедура Close - для закрытия файлов после завершения работы с ними. Во всех случаях параметры этих вызовов аналогичны параметрам, задаваемым для обычных файлов. Необходимо только иметь в виду, что операция Reset открывает текстовый файл для последовательного ЧТЕНИЯ из него, а операция Rewrite - для ОБНОВЛЕНИЯ файла (то есть записи в него). Эту разницу следует помнить, так как после открытия текстового файла можно либо только читать из него, либо только писать. Если необходимо изменить характер работы с текстовым файлом, необходимо заново открыть его, используя нужную процедуру.

Дополнительно для текстовых файлов определены следующие операции:

Append - процедура имеет один параметр - файловую переменную и предназначена, аналогично Rewrite, для открытия файла с последующей записью в него. Однако, процедура Append HE ОЧИЩАЕТ файл, а только устанавливает текущий указатель файла в его конец. Таким образом, процедуру Append удобно использовать, когда необходимо добавить новые строки в конец уже существующего файла.

2. Операции, связанные с вводом-выводом. В данном случае две основные операции - чтение из текстового файла и запись в текстовый файл - производятся с помощью тех же процедур Read и Write, что и для обычных файлов. Но здесь необходимо понимать, что текстовый файл по определению содержит символьную информацию, поэтому при записи значения других типов будут преобразовываться в символьное представление и в таком виде записываться в очередную строку текстового файла. Аналогично, при чтении из текстового файла очередная часть текущей строки будет пониматься как символьное представление значения, тип которого определяется типом очередной переменной из процедуры Read. В данном случае разделителями символьных представлений значений служат символы пробелов и табуляции.

Помимо процедур Read и Write, для текстовых файлов имеются две их модификации - процедуры ReadLn и WriteLn. Эти процедуры осуществляют те же действия, что и соответствующие процедуры Read и Write, но ПОСЛЕ операций чтения и записи производят переход к следующей строке текстового файла. Заметим, что операция Read автоматически переходит к следующей строке только в случае исчерпания текущей строки; процедура ReadLn позволяет совершить этот переход, не дожидаясь исчерпания строки.

Для того, чтобы проверить, достигнут ли конец текущей строки, используется функция EoLn. Эта функция вызывается с одним параметром (файловой переменной) и возвращает логическое значение: true, если текущая строка исчерпана, и false в противном случае.

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

Следует обратить внимание, что для текстовых файлов НЕПРИМЕНИМА операция поиска записи с нужным номером (процедура Seek), определенная для обычных файлов, ввиду произвольных длин строк текстового файла. Некоторым подобием процедуры Seek для текстовых файлов являются функции SeekEoLn и SeekEof. Обе эти функции вызываются с одним параметром - файловой переменной - и возвращают логическое значение.

Функция SeekEoLn производит поиск конца текущей строки. Она пропускает все символы-разделители значений в строке (пробелы и табуляции) и устанавливает текущий указатель файла либо на конце строки (и тогда возвращает true), либо на первом значащем символе.

Функция SeekEoF осуществляет поиск конца файла и действует аналогично функции SeekEoLn, но кроме символов-разделителей она пропускает символы концов строк (то есть переходит со строки на строку) в поисках либо конца файла, либо первого значащего символа. Если в процессе поиска найден конец файла, то функция возвращает true, в противном случае - false.

Стандартные текстовые файлы

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

Input

Output

и обозначают (по терминологии MS-DOS), соответственно, стандартный файл ввода и стандартный файл вывода. Обычно эти стандартные файлы связаны с конкретными физическими устройствами компьютера. Так, файловая переменная Input связана с клавиатурой, файловая переменная Output -с экраном дисплея. Эти файлы считаются заранее открытыми, а соответствующие идентификаторы можно использовать в операциях ввода-вывода.

Рассмотрим, например, следующий оператор:

Writeln(Output,'Результат = ',(X+Y)*2)

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

Аналогичным образом (с точностью до наоборот) будет выполняться, например, следующий оператор:

Read(Input,XI,Х2)

При выполнении этого оператора система перейдет в состояние ожидания ввода с клавиатуры двух значений. Типы вводимых значений должны совпадать с типами переменных XI и Х2; эти значения при вводе должны отделяться друг от друга одним или несколькими пробелами, а ввод должен быть завершен нажатием клавиши Enter. В процессе ввода значений набираемые на клавиатуре символы отображаются на экране. После нажатия Enter введенные значения будут присвоены переменным XI и Х2, и выполнение программы будет продолжено.

Для стандартных файлов Input и Output допускается сокращенная форма записи операций ввода-вывода. Так, если в процедурах Read и ReadLn первый параметр опущен, то по умолчанию подразумевается файл Input. Аналогично, отсутствие в процедурах Write и WriteLn первого параметра означает вывод в стандартный файл Output.

В соответствии с общими правилами MS-DOS стандартные файлы ввода-вывода могут быть "переназначены", то есть связаны с другими физическим устройствами или с дисковыми файлами. Простейшим способом переназначения является использование для этой цели процедуры Assign, например:

Assign(Output,'myfile.out')

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

Более подробные сведения о стандартных файлах содержатся в руководстве по операционной системе MS-DOS и фирменных материалах по системе Turbo Pascal.

Файлы без типа

Кроме определенных в авторской версии языка типизированных файлов и текстовых файлов, Turbo Pascal содержит понятие нетипизированных файлов или файлов без типа. Соответствующие переменные описываются с помощью служебного слова file (без of), например:

var

Data : file;

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

Нетипизированные файлы открываются теми же процедурами, что и обычные и текстовые файлы, - Reset и Rewrite, но для нетипизированных файлов вторым параметром этих процедур должен быть задан размер записи (элемента файла), например:

Assign(Data, 'MYDATA.DTA') ; Reset(Data,200);

Размер записи задается в байтах; если второй параметр опущен, то предполагается размер в 128 байтов. При этом следует учитывать два обстоятельства. Во-первых, для обеспечения максимальной скорости обмена длина записи должна быть кратной размеру физического сектора диска -512 байтов. С другой стороны, нужно помнить, что общий размер файла может не быть кратен выбранному размеру записи (последняя запись может быть неполной). Для того, чтобы гарантированно обеспечить полное чтение всего файла, нужно установить размер записи равным 1.

Для организации обменов с нетипизированными файлами в языке Turbo Pascal предназначены две стандартные процедуры:

BlockRead

BlockWrite

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

BlockRead ( var F:file; var Buf; Count:word )

BlockRead ( var F:file; var Buf; Count:word; var Result:word )

Здесь F - имя нетипизированного файла, из которого производится чтение; Buf - переменная-буфер (этот параметр передается как нетипизированный); Count - число записей, читаемых за один вызов. Кроме этого, BlockRead может содержать еще один параметр - Result, в который помещается число фактически прочитанных записей. Переменная F должна быть описана как нетипизированный файл, связана с конкретным физическим диском процедурой Assign; файл должен быть открыт процедурой Reset.

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

Аналогично описывается стандартная процедура BlockWrite:

BlockWrite ( var F:file; var Buf; Count:word )

BlockWrite ( var F:file, var Buf; Count:word; var Result:word )

Смысл параметров тот же, что и у параметров предыдущей процедуры, с той лишь разницей, что файл F должен быть подготовлен для записи процедурой Rewrite. Содержимое переменной Buf целиком помещается в файл F, начиная с текущей записи.

В обеих процедурах нужно следить за тем, чтобы размер переменной-буфера Buf был равен RecSize*Count, где RecSize - размер записи, указанной в процедурах Reset или Rewrite, Count - число читаемых (записываемых) записей, то есть значение параметра.

Если при записи в файл процедурой BlockWrite на диске не окажется свободного пространства или при чтении из файла процедурой BlockRead размер буфера окажется меньше указанного выше произведения, то произойдет следующее: если последний параметр Result в этих вызовах не задан, то возникнет ошибка ввода-вывода; если параметр Result задан, то ошибка не будет зафиксирована, а после выполнения процедуры его значение не будет совпадать с значением параметра Count. Последнее обстоятельство можно проверить, сравнив два указанных значения.

Приведем простой пример использования нетипизированных файлов для копирования информации, взятый из подсистемы оперативной помощи Turbo Pascal. В следующей программе используются стандартные функции ParamCount и ParamStr, обрабатывающие строковые параметры, передаваемые программе при ее запуске из командной строки или через альтернативу Run/Parameters. .. интегрированной среды. Функция ParamCount возвращает общее число переданных параметров, а функция ParamStr - строку, содержащую параметр с указанный порядковым номером.

program FileCopy;

{Копирование файла; файл-источник и файл-приемник} {задаются в виде строковых параметров программы. } {Упрощенный вариант (без контроля ошибок) }

const

RecSize = 512, {размер буфера обмена}

var Fileln, FileOut : file;

{ копируем Fileln -> FileOut }

NumRead, { число фактически считанных }

NumWritten: Word; { и фактически записанных записей } Buf: array[1..RecSize] of char; {буфер обмена }

begin

if ParamCount<2 then Halt;{ проверка числа параметров}

{ Открываем файл-источник }

Assign(Fileln,ParamStr(1));

{$I-}

Reset (FileIn,1);

{$I+}

if IOResult <> 0 then begin

 Writeln('Файл-источник не найден');

 Halt

end;

{ Открываем файл-приемник }

Assign(FileOut,ParamStr(2)),

Rewrite(FileOut,1);

WriteLn('Копируем ',ParamStr(1),' -> ',ParamStr(2));

{ Цикл копирования }

repeat

 BlockRead(Fileln,Buf, RecSize,NumRead) ;

 BlockWrite(FileOut,Buf,NumRead,NumWritten);

until (NumRead = 0) or (NumWritten <> NumRead); WriteLn('Копирование закончено');

{ Закрываем файлы }

Close(Fileln);

Close(FileOut)

end.

В заключение заметим, что после каждого вызова процедур BlockRead и BlockWrite текущий указатель файла смещается на число записей, фактически участвовавших в обмене. Дополнительно допускается использование процедур и функций Seek, FileSize и FilePos для организации доступа к любой записи нетипизированного файла.


 

А также другие работы, которые могут Вас заинтересовать

54418. ІННОВАЦІЙНІ ТЕХНОЛОГІЇ ВИЯВЛЕННЯ, НАВЧАННЯ І ПІДТРИМКИ РОЗВИТКУ ОБДАРОВАНОЇ МОЛОДІ 367 KB
  Профільне навчання в сучасній школі як технологічне рішення по створенню розвивального середовища для обдарованої молоді. Теоретичний аналіз світового досвіду профільної диференціації навчання.Сутність мета і принципи профільного навчання.
54419. Молюски 137.5 KB
  Мета: перевірити та узагальнити знання учнів з теми, сприяти застосуванню теоретичного матеріалу, виховувати вміння звертатися до свого досвіду, розвивати творчу активність, пізнавальні інтереси учнів, продовжувати формувати вміння працювати з роздатковим матеріалом, додатковою літературою, порівнювати, узагальнювати, робити висновки.
54420. Тип Молюски 377 KB
  Цель урока: Обобщить и систематизировать знания учащихся об особенностях строения и физиологии моллюсков разных классов в связи с образом жизни их значении в экосистемах и для человека ; Развивать интеллектуальные и умственные способности: умения анализировать сравнивать логически мыслить делать выводы; Воспитывать бережное отношение к природе развивать экологическое мышление; формировать культуру общения поддерживать психологический микроклимат доверия толерантного отношения друг к другу. Учащиеся должны знать: Общие признаки...
54421. Money 147.5 KB
  So, we need many things to be happy and one of them is money . Today we are going to talk about money and everything connected with it. You know how important money is in our life. Practically all our life is based on money. The majority of relations in the modern world are based on money.
54422. MONEY MAKES THE WORLD GO ROUND 72 KB
  And now you can read the key -word. Its the topic of our today lesson. Lets begin our discussion with the song. You know, friends, that there are so many different songs about money. Id like you to listen to one of the most famous ones sung by legendary group ABBA. Youve heard it already. But while listening fill in the gaps with the necessary words from the list below.
54423. Мониторинг как технология управления качеством образования учащихся в профильной школе 96 KB
  В связи с этим важное значение приобретает социальнопедагогический мониторинг качества образования учащихся позволяющий своевременно получать полную и объективную информацию о результатах работы в профильной школе и осуществлять прогнозирование ее развития. Объектом мониторинга является многоаспектная интеграция включающая учащихся и педагогов нормативное и процессуальное сопровождение образовательные профессиональные и личностные достижения всех участников образовательного взаимодействия и управления качеством профильного обучения....
54424. Мониторинг окружающей среды в Украине 80.5 KB
  Цель: организовать и провести в школе экологическую работу с группой детей и помочь им спасти жителей Мусорного острова; показать учащимся возможности применения экологических навыков в повседневной жизни; воспитывать уважительное отношение к окружающей среде и осознавать свою роль в ней. Изучение проблемы мусора. Реализация акции Нажми на мусор. Для того чтобы ознакомить детей с проблемой бытовых отходов необходимо начать работу с постановки проблемы мусора.
54425. Посилення великокнязівської влади за Володимира Мономаха 58.5 KB
  Мета: характеризувати процес посилення великокнязівської влади за Володимира Мономаха та довести що за його правління Київська Русь зазнала періоду піднесення; розвивати в учнів уміння давати характеристику історичному діячу визначати його місце в історичному процесі аналізувати матеріал роботи висновки працювати з джерелами інформації; переконати учнів у силі згуртованості та єдності на прикладі діяльності Володимира Мономаха виховання почуття патріотизму. Обладнання: Портрет Володимира Мономаха картини картки з джерелами...
54426. Владимир Мономах его внутренняя и внешняя политика 98.5 KB
  ЦЕЛЬ: охарактеризовать процесс усиления великокняжеской власти при Владимире Мономахе и доказать на примерах его внутренней и внешней политики что в период его правления Киевская Русь переживает период расцвета; развивать умение учащихся давать характеристику историческому деятелю определять его место в историческом процессе работать с картой анализировать материал делать выводы работать с историческими источниками; убедить учащихся в силе единства на примере деятельности Владимира Мономаха. ОБОРУДОВАНИЕ: карта портрет Владимира...