Функция ferror является предикатом, который
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;