Системное программирование в UNIX средствами Free Pascal



         

Описание


uses stdio;

function ferror(_stream:pfile):integer;

function feof(_stream:pfile):integer;

procedure clearerr(_stream:pfile);

function fileno(_stream:pfile):longint;

Функция ferror является предикатом, который возвращает ненулевое значение, если в потоке _stream возникла ошибка во время последнего запроса на ввод или вывод. Ошибка может возникать в результате вызова примитивов доступа к файлам (fdread, fdwrite и др.) внутри процедуры стандартного ввода/вывода. Если же функция ferror возвращает нулевое значение, значит, ошибок не было. Функция ferror может использоваться следующим образом:

if ferror(_stream) <> 0 then

begin

  (* Обработка ошибок *)

end

else

begin

  (* Ошибок нет *)

end;

Функция feof является предикатом, возвращающим ненулевое значение, если для потока _stream достигнут конец файла. Возврат нулевого значения просто означает, что этого еще не произошло.

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

Функция fileno является вспомогательной и не связана с обработкой ошибок. Она возвращает целочисленный дескриптор файла, содержащийся в структуре TFILE, на которую указывает параметр _stream. Это может быть полезно, если нужно передать какой-либо процедуре дескриптор файла, а не идентификатора потока TFILE. Однако не следует использовать процедуру fileno для смешивания вызовов буферизованного и небуферизованного ввода/вывода. Это почти неизбежно приведет к хаосу.

Следующий пример – процедура egetc использует функцию ferror, чтобы отличить ошибку от достижения конца файла при возврате процедурой getc значения ЕОF.

(* Процедура egetc - getc с проверкой ошибок *)

uses stdio;

function egetc (stream:pfile):longint;

var

  c:longint;

begin

  c := getc (stream);

  if c = EOF then

  begin

    if ferror (stream) <> 0 then

    begin

      writeln (stderr, 'Фатальная ошибка: ошибка ввода');

      halt (1);

    end

    else

      writeln (stderr, 'Предупреждение: EOF');

  end;

  egetc:=c;

end;




Содержание  Назад  Вперед