Иллюстрированный самоучитель по Turbo Pascal

Обработка ошибок. Прямой доступ к потокам. Использование потоков с произвольными данными.

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

Поле Status определяет тип ошибки, в соответствии со следующими константами модуля Objects:

const
stOk = 0; {Нет ошибки}
stError =-1; {Ошибка доступа}
stInitError =-2; {Ошибка инициации потока}
stReadError =-3; {Чтение за концом потока}
stWriteError =-4; {Нельзя расширить поток}
stGetError =-5; (Get для незарегистрированного объекта}
stPutError =-6; {Put для незарегистрированного объекта}

Поле ErrorInfo определено только для Status – -5 или Status – -6: в первом случае оно содержит регистрационный номер, полученный из потока и не обнаруженный в регистрационном списке; во втором – смещение ТВМ незарегистрированного объекта, который программа пытается поместить в поток.

Сразу после обнаружения ошибки Turbo Vision блокирует все операции с потоком до тех пор, пока аварийная ситуация не будет сброшена обращением к методу TStream.Reset.

Прямой доступ к потокам

Поток имеет методы, имитирующие файловые процедуры прямого доступа к дисковому файлу.

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

Метод Seek (Pos: LongInf) перемещает текущую позицию в потоке в байт Pos от начало потока.

Метод GetSize возвращает общий размер потока в байтах.

С помощью метода Truncate можно удалить из потока все данные, начиная с текущей позиции до конца потока.

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

Использование потоков с произвольными данными

Хотя потоки спроектированы в основном для работы с объектами, Вы можете использовать их для хранения не только полей объектов, но и любых других данных. При этом не следует обращаться к методам Put и Get, так как они предполагают доступ к объектам. Вместо этого Вы должны обратиться к низкоуровневым процедурам Write и Read.

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

Uses Objects; var
S: TBufStream; {Экземпляр потока}
k, j: Integer;
begin
WriteLn('Запись в поток:');
S.lnit('Test.dat', stCreate, 512); {Создаем поток}
for k: = 1 to 10 do
begin
j: = Random(l00); {Получаем случайное целое}
Write(j:8); {Выводим на экран}
S.Write(j,2) {Помещаем в поток}
end;
Done; {Удаляем поток}
S.lnit('Test.dat', stOpenRead, 512);
WriteLn;
WriteLn('Чтение из потока:');
for k: = 1 to 10 do
begin
S.Read(j,2); {Получаем целое из потока}
Write (j:8) {Выводим на экран}
end;
S.Done;
WriteLn
end.

Для простоты в программу не включены средства контроля ошибок. В ходе прогона программы в текущем каталоге диска будет создан файл TEST.DАТ размером в 20 байт, а на экран будут выведены две строки с одинаковыми числами.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.