Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > [Delphi]Удаление строк файла до символа


Автор: shoker 28.7.2012, 22:48
вот такая проблемка,есть файл(не текстовый)это скорее зашифрованный png,вот,в нем есть строка например,"hi,world!‰png"файлов несколько,и у них разная длина строк,может быть их 10 строк.так вот,нужно удалить все строки/символы до ‰png,и сохранить например в папку "картинки",но при этом изменения не должны сохранится в исходный файл

заранее спасибо за ответ:-)

Автор: Чучмек 28.7.2012, 23:04
для неюникодной delphi
Код

h1:=fileopen(filename,0);
fs:=getfilesize(h1,nil);
getmem(p1,fs);
fileread(h1,p1^,fs);
p2:=strpos(p1,'‰png');
if p2<> nil then
 begin
 h2:=filecreate(newfilename);
 filewrite(h2,p2^,fs-(cardinal(p2)-cardinal(p1)));
 fileclose(h2);
 end;
freemem(p1);
fileclose(h1);


Добавлено @ 23:09
Для юникодной вместо strpos  - AnsiStrPos

Добавлено позже
писал без delphi, ввела в заблуждение неправильная справка http://delphi.scps.ru/string/str5230.htm
Правильно вот
Цитата

function StrPos(const Str1, Str2: PChar): PChar;
StrPos returns a pointer to the first occurrence of Str2 in Str1. If Str2 does not occur in Str1, StrPos returns nil 

Автор: shoker 28.7.2012, 23:44
Цитата(Чучмек @ 28.7.2012,  23:04)
для неюникодной delphi
Код

h1:=fileopen(filename,0);
fs:=getfilesize(h1,nil);
getmem(p1,fs);
fileread(h1,p1^,fs);
p2:=strpos('‰png',p1);
if p2<> nil then
 begin
 h2:=filecreate(newfilename);
 filewrite(h2,p2^,fs-(cardinal(p2)-cardinal(p1)));
 fileclose(h2);
 end;
freemem(p1);
fileclose(h1);


Добавлено @ 23:09
Для юникодной вместо strpos  - AnsiStrPos

спс,а можно var написать?

Автор: shoker 29.7.2012, 22:24
файлик

Автор: Чучмек 29.7.2012, 23:10
Так ‰png != ‰PNG
Код

function binpos(p:pointer;substr:pchar;length:cardinal):pointer;
var i,j,l:cardinal;
begin
i:=0;
l:=strlen(substr);
length:=length-l;
result:=nil;
while i<=length do
 begin
 for j:=0 to l-1 do
   if pchar(cardinal(p)+i+j)^<>(substr+j)^ then break;
 if j=l then
   begin
   result:=pointer(cardinal(p)+i);
   break;
   end;
 inc(i);
 end
end;




procedure TForm1.Button1Click(Sender: TObject);
var
 h1,h2,fs:cardinal;
 p1,p2:pointer;
begin
if not opendialog1.Execute or not savedialog1.Execute then exit;
h1:=fileopen(opendialog1.FileName,0);
fs:=getfilesize(h1,nil);
getmem(p1,fs);
fileread(h1,p1^,fs);
p2:=binpos(p1,'‰PNG',fs);
if p2<> nil then
 begin
 h2:=filecreate(savedialog1.FileName);
 filewrite(h2,p2^,fs-(cardinal(p2)-cardinal(p1)));
 fileclose(h2);
 end;
freemem(p1);
fileclose(h1);

end;


Автор: shoker 30.7.2012, 11:19
как должно быть:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)