Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

13.3. Бинарные файлы

Упражнение 13.24. Напишите программу, копирующую бинарный файл в обратном порядке байт.

var

fb,copyfb:file of byte;

size,n:longint;

b:byte;

{$I-}

begin

if paramcount<>2 then

begin

writeln('Используйте: ',paramstr(0),' входной_файл выходной файл');

exit;

end;

assign(fb,paramstr(1));

assign(copyfb,paramstr(2));

reset(fb);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(1),' для чтения');

exit;

end;

rewrite(copyfb);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(2),' для записи');

exit;

end;

n:=filesize(fb);

while n>=0 do

begin

//n:=n-2;

seek(fb,n-1);

//blockread(fb,b,1);

//blockwrite(copyfb,b,1);

read(fb,b);

write(copyfb,b);

n:=n-1;

end;

close(fb);

close(copyfb);

end.

Упражнение 13.25. Составьте программу кодировки и раскодировки файлов по заданному ключу (строке символов).

{I-}

var

fin,fout:file of byte;

pass:string;

size:longint;

b:byte;

begin

if paramcount<>2 then

begin

writeln('Используйте: ',paramstr(0),' входной_файл выходной файл');

exit;

end;

assign(fin,paramstr(1));

assign(fout,paramstr(2));

reset(fin);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(1),' для чтения');

exit;

end;

rewrite(fout);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(2),' для записи');

exit;

end;

writeln('Введите кодовое слово: ');

readln(pass);

size:=0;

while not(eof(fin)) do

begin

read(fin,b);

b:=b xor byte(pass[1 + (size mod length(pass))]);

write(fout,b);

inc(size);

end;

close(fin);

close(fout);

end.

Упражнение 13.26. Составьте аналог команды cmp.

type

mas=array [1..1] of byte;

var

fb,fbx:file of byte;

size,n,nx,i:longint;

t:boolean;

b,bx:byte;

a:^mas;

{$I-}

begin

if paramcount<>2 then

begin

writeln('Используйте: ',paramstr(0),' входной_файл выходной файл');

exit;

end;

assign(fb,paramstr(1));

assign(fbx,paramstr(2));

reset(fb);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(1));

exit;

end;

reset(fbx);

if ioresult<>0 then

begin

writeln('Ошибка открытия файла: ',paramstr(2));

exit;

end;

n:=filesize(fb);

nx:=filesize(fbx);

{ if n<>nx then begin

writeln('файлы ',paramstr(1),' и ',paramstr(2),' не идентичны');

exit;

end;}

t:=false;

if n=nx then

begin

getmem(a,nx);

t:=true;

while n>=0 do

begin

read(fb,b);

read(fbx,bx);

if b<>bx then

begin

a^[nx-n]:=bx;

t:=false;

end;

n:=n-1;

end;

if not t then

begin

writeln('различия в файлах:');

for i:=1 to nx do

writeln('номер байта в файле ',i,' ,байт',a^[i] );

end;

freemem(a,nx);

end;

if t then writeln('файлы ',paramstr(1),' и ',paramstr(2),' идентичны');

if n<>nx then

begin

writeln('файлы ',paramstr(1),' и ',paramstr(2),' не идентичны');

exit;

end;

close(fb);

close(fbx);

end.

Упражнение 13.27. Создайте упрощенную версию команды ср, копирующую один файл в другой с отображением файла на память.

uses crt,sysutils,linux;

type

smth=array [0..0] of char; (*безразмерный массив*)

psmth=^smth; (*то же, что и pchar*)

var

s1,s2:array [0..1000] of char; (*для имен файлов*)

t1,t2:integer; (*дескрипторы файлов*)

n,w:longint; (*счетчик байт и размер файла*)

m:tmmapargs; (*запись с параметрами mmap*)

p1,p2:psmth; (*указатели, возвращаемые mmap*)

BEGIN

writeln('Введите имя первого файла');

readln(s1);

{$I-}

(*проверка на существование первого файла и доступность для чтения*)

if not access(pchar(s1),f_ok or r_ok) then

begin

writeln('Файл '+pchar(s1)+' не существует или недоступен для чтения');

halt(1);

end;

writeln('Введите имя второго файла');

readln(s2);

(*открытие первого файла для чтения*)

t1:=fdopen(s1,Open_RDONLY);

w:=fdseek(t1,0,SEEK_END); (*определение размера файла*)

(*заполнение параметров для mmap*)

m.address:=0; (*несущественно*)

m.offset:=0; (*начальное смещение в файле*)

m.size:=w; (*размер файла*)

m.flags:=MAP_SHARED; (*отображение с занесением изменений в файл*)

m.prot:=PROT_READ; (*задание доступа для чтения*)

m.fd:=t1; (*дескриптор файла*)

p1:=psmth(mmap(m)); (*получаем указатель на область памяти, связанную с файлом*)

if longint(p1)=-1 then

begin

writeln('Ошибка вызова mmap (t1)');

fdclose(t1);

halt(0);

end;

(*создаем второй файл, существующий усекаем до нулевого размера*)

t2:=fdopen(s2,Open_WRONLY or Open_TRUNC or Open_CREAT, octal(640));

if t2=-1 then

begin

writeln('Файл ',s2,' не удалось создать или открыть для записи');

halt(1);

end;

fdseek(t2,w-1,SEEK_SET);(*перемещаемся на w-1 байт от начала*)

fdwrite(t2,w,1); (*... и записываем 1 байт для подгоники размеров файлов*)

fdclose(t2);

t2:=fdopen(s2,Open_RDWR);(*переоткрываем второй файл для чтения и записи*)

m.address:=0;

m.offset:=0;

m.size:=w;

m.flags:=MAP_SHARED;

m.prot:=PROT_WRITE or PROT_READ;

m.fd:=t2;

p2:=psmth(mmap(m));

if longint(p2)=-1 then

begin

writeln('Ошибка вызова mmap (t2)');

fdclose(t1);

fdclose(t2);

munmap(p1,w);

halt(0);

end;

(*копируем данные из одной отображенной области в другую*)

for n:=0 to w-1 do

p2^[n]:=p1^[n];

(*снимаем отображение и закрываем файлы*)

munmap(p1,w);

munmap(p2,w);

fdclose(t1);

fdclose(t2);

writeln('Файл ',s1,' скопирован в файл ',s2);

END.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal