(* Функция getoccupier получить фамилию из файла residents *)

uses linux;

const
  NAMELENGTH=41;

var
  namebuf:array [0..NAMELENGTH-1] of char;	(* Буфер для фамилии *)
const
  infile:integer=-1;		(* Для хранения дескриптора файла *)

function getoccupier(roomno:integer):pchar;
var
  offset, nread:longint;
begin
  (* Убедиться, что файл открывается впервые *)
  if infile = -1 then
  begin 
    infile := fdopen ('residents', Open_RDWR);
    if infile = -1 then
    begin
      getoccupier := nil;		(* Невозможно открыть файл *)
      exit;
    end;
  end;

  offset := (roomno - 1) * NAMELENGTH;

  (* Найти поле комнаты и считать фамилию жильца *)
  if fdseek (infile, offset, SEEK_SET) = -1 then
  begin
    getoccupier := nil;
    exit;
  end;

  nread := fdread (infile, namebuf, NAMELENGTH);
  if nread <= 0 then
  begin
    getoccupier := nil;
    exit;
  end;

  (* Создать строку, заменив символ перевода строки на '\0' *)
  namebuf[nread - 1] := #0;
  getoccupier := namebuf;
end;

(* Программа listoc выводит все фамилии жильцов *)

const
  NROOMS=10;

var
  j:integer;
  p:pchar;
begin

  for j := 1 to NROOMS do
  begin
    p := getoccupier (j);
    if p<>nil then
      writeln('Комната ', j:2, ', ', p)
    else
      writeln('Ошибка для комнаты ', j);
  end;
end.
