Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.008 c
7-39874
Потерянный
2002-02-13 16:10
2002.05.13
Спящий режим


4-39905
Ray
2002-03-12 14:03
2002.05.13
Почему слетает HOOK на клавиатуру!?


1-39757
Makss
2002-04-27 19:59
2002.05.13
Проблема с загрузкой проги


3-39649
rvs
2002-04-17 11:38
2002.05.13
Query в Query


7-39869
NW
2002-02-14 19:07
2002.05.13
Виртуальный логический диск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский