Главная страница
    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.007 c
6-39810
Andrews
2002-03-01 12:42
2002.05.13
Копирование файлов в сетевую папку с полным доступом, но защищенную паролем


3-39673
sergling
2002-04-16 23:03
2002.05.13
Доступ к MSSQL


4-39918
chernoruk
2002-03-09 05:58
2002.05.13
Убить диалоговое окно!


1-39705
VID
2002-04-29 16:56
2002.05.13
Сканирование всех компонентов в форме (юните) чужого приложения


14-39850
VictorT
2002-04-04 11:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский