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



Описание


uses linux;

Function fdWrite (fd:longint; var buf; size:longint):longint;

Так же, как и вызов fdread, вызов fdwrite имеет три аргумента: дескриптор файла filedes, указатель на записываемые данные buffer и n – положительное число записываемых байтов. Возвращаемое вызовом значение является либо числом записанных символов, либо кодом ошибки -1. Фактически, если возвращаемое значение не равно -1, то оно почти всегда будет равно n. Если оно меньше n, значит, возникли какие-то серьезные проблемы. Например, это может произойти, если в процессе вызова fdwrite было исчерпано свободное пространство на выходном носителе. (Если носитель уже был заполнен до вызова fdwrite, то вызов вернет значение -1.)

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

var

  fd:integer;

  w1, w2 : longint;

  header1: array [0..511] of char;

  header2: array [0..1023] of char;

.

.

.

fd := fdopen('newfile', Open_WRONLY or Open_CREAT or Open_EXCL, octal(0644));

if fd = -1 then

  exit;

w1 := fdwrite(fd, header1, 512);

w2 := fdwrite(fd, header2, 1024);

дает в результате файл длиной 1536 байт, с содержимым массивов header1 и header2.

Что произойдет, если программа откроет существующий файл на запись и сразу же запишет в него что-нибудь? Ответ очень прост: старые данные в файле будут заменены новыми, символ за символом. Например, предположим, что файл oldhat имеет длину 500 символов. Если программа откроет файл oldhat для записи и выведет в него 10 символов, то первые 10 символов в файле будут заменены содержимым буфера записи программы. Следующий вызов fdwrite заменит очередные 10 символов и так далее. После достижения конца исходного файла в процессе дальнейших вызовов fdwrite его длина будет увеличиваться. Если нужно избежать переписывания файла, можно открыть файл с флагом Open_APPEND. Например:

filedes := fdopen(filename, Open_WRONLY or Open_APPEND);

Теперь в случае успешного вызова fdopen указатель чтения-записи будет помещен, сразу же за последним байтом в файле, и вызов fdwrite будет добавлять данные в конец файла. Этот прием более подробно будет объяснен в разделе 2.1.12.

Программа, демонстрирующая fdOpen, fdwrite и fdCLose.

Uses linux;

Const Line : String[80] = 'This is easy writing !';

Var FD : Longint;

begin

  FD:=fdOpen ('Test.dat',Open_WrOnly or Open_Creat);

  if FD>0 then

    begin

    if length(Line)<>fdwrite (FD,Line[1],Length(Line)) then

      Writeln ('Error when writing to file !');

    fdClose(FD);

    end;

end.




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