Форум: "Потрепаться";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
ВнизЗадачка Найти похожие ветки
← →
Alx2 (2002-04-04 15:57) [0]Пусть имеется бинарный файл A. Необходимо создать файл B, в котором байты будут следовать в порядке, обратном A. Доступная память неограничена.
Код, исполняющий это, должен быть как можно короче.
← →
Виктор Щербаков (2002-04-04 16:07) [1]У Рихтера есть решение...
Или ты короче придумал???
← →
Alx2 (2002-04-04 16:10) [2]>Виктор Щербаков © (04.04.02 16:07)
Слушай, не знал. А какое у него?
← →
VictorT (2002-04-04 16:14) [3]А какое решение у Рихтера? Мне приходит в голову только читать файл с конца, и писать в другой ну и его вариации вроде: считать в память, "вывернуть наизнанаку", записать и т.д.
← →
Виктор Щербаков (2002-04-04 16:14) [4]Через проецируемые файлы. К сожалению сейчас нет под рукой книги, чтобы посмотреть.
Только условие задачи у него несколько иное (более сложное):
нужно файл перезаписать задом наперед.
← →
zarum (2002-04-04 16:15) [5]дурацкий путь решения - записать этот файл в БД и пройтись по записям в обратном порядке...
← →
SPeller (2002-04-04 16:17) [6]Набросок:
var i:integer;hfile,l:longint;bt:byte;
begin;
hfile:=openfile("c:\myfile");
l:=filelength(hfile);
for i:=1 to l do begin;
setfilepointer(l-i+1);
readfile(hfile,bt);
writefile(hfile,bt);
end;
closehandle(hfile);
← →
SPeller (2002-04-04 16:19) [7]Немного ошибся, надо так :
var i:integer;hfile,hfile2,l:longint;bt:byte;
begin;
hfile:=openfile("c:\infile");
hfile2:=openfile("c:\outfile");
l:=filelength(hfile);
for i:=1 to l do begin;
setfilepointer(l-i+1);
readfile(hfile,bt);
writefile(hfile2,bt);
end;
closehandle(hfile);
closehandle(hfile2);
← →
Alx2 (2002-04-04 16:21) [8]>Виктор Щербаков © (04.04.02 16:14)
>Через проецируемые файлы.
У меня в загашнике другое, но ОЧЕНЬ ресурсоемкое решение. Вряд ли Рихтер стал бы его исползовать...
>VictorT © (04.04.02 16:14)
Сорри, забыл указать, что доступ только последовательный.
← →
Alx2 (2002-04-04 16:23) [9]Ребята, прощу прощения, забыл написать, что доступ только последовательный
← →
SPeller (2002-04-04 16:26) [10]Alx2 ©
Последовательный т.е. байт за байтом ? (я слабоват в терминологии :))
← →
MBo (2002-04-04 16:29) [11]FS1:=TFileStream.Create(fn,fmOpenRead);
setlength(s,FS1.Size);
FS1.read(s[1],FS1.Size);
FS2:=TFileStream.Create(fn2,fmCreate);
for i:=length(S) downto 1 do
FS2.Write(s[i],1);
← →
Alx2 (2002-04-04 16:30) [12]>SPeller © (04.04.02 16:26)
Нельзя вставать на n-ю позицию в файле не прочитав всё предыдущее. Короче говоря не работает ни Seek ни SetFilePointer
← →
SPeller (2002-04-04 16:32) [13]Ну тогда и мой пример урезать мона
l:=filelength(hfile);
for i:=1 to l do begin;
setfilepointer(l-i+1);
readfile(hfile,bt);
writefile(hfile2,bt);
end;
Получится как у MBo © но быстрее за счёт использования API.
← →
VictorT (2002-04-04 16:32) [14]>Alx2 © (04.04.02 16:21)
>У меня в загашнике другое, но ОЧЕНЬ ресурсоемкое решение.
>Сорри, забыл указать, что доступ только последовательный.
Если ресурсоёмкое, и доступ только последовательный, то тогда наверное считать весь файл в память, а потом записать его в файл, начиная с конца (как вариант - использовать стек).
← →
SPeller (2002-04-04 16:34) [15]Alx2 © (04.04.02 16:30)
Ааа, всмысле таком... я понял...
← →
Alx2 (2002-04-04 16:34) [16]>MBo © (04.04.02 16:29)
А еще короче? :)
Хотя тут уже начинают сомнения грызть по поводу что считать еще короче...
Наверное, количество операторов или "сложность" кода?
← →
SPeller (2002-04-04 16:36) [17]
readfile(hfile,@array[1],l);
for i:=l downto 1 do
writefile(hfile2,array[i],1);
← →
Alx2 (2002-04-04 16:38) [18]>VictorT © (04.04.02 16:32)
Да, со стеком.
Вот мой вариант:
Type
TbFile = file of byte;
procedure Inverse(Var F : TbFile; Var G: TbFile);
Var b : byte;
begin
Read(F,b);
Inverse(F,G);
Write(G,b);
end;
считаем, что "снаружи" файлы открыты на запись и на чтение соответственно.
← →
Alx2 (2002-04-04 16:48) [19]Чуть-чуть (почти в шесть раз) поэкономнее в смысле затрат стека:
Type
TbFile = file of byte;
Var F,G : TbFile;
procedure Inverse;
Var b : byte;
begin
Read(F,b);
Inverse(F,G);
Write(G,b);
end;
← →
Anatoly Podgoretsky (2002-04-04 17:21) [20]Я бы поступил так, считал весь файл в динамический масси, затем в памяти сделал преворот, потом весь файл обратно.
Так ака память неограничено, то это будет самый быстрый метод.
← →
VictorT (2002-04-04 17:37) [21]2 Виктор Щербаков ©
А что такое эти проецируемые файлы?
← →
Виктор Щербаков (2002-04-04 17:42) [22]VictorT © (04.04.02 17:37)
В SDK в разделе File Mapping подробно описано.
← →
VictorT (2002-04-04 17:47) [23]2 Виктор Щербаков © (04.04.02 17:42)
Спасибочки.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c