HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл
  #1  
Старый 26.05.2009, 15:17
Jim_Di
Познающий
Регистрация: 20.11.2008
Сообщений: 32
С нами: 9196320

Репутация: 39
По умолчанию [Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл

надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (RIFF WAVE) я нашёл, теперь проблема в том, чтобы сохранить

Код:
var
   FHandle, FSave, SizeFile, BytesRW, RW: Cardinal;
   l: Longint;
   oldstring: string;
   SIZE: DWORD;
   wavsize:integer;
   n: integer;
 begin
   FHandle := FileOpen('c:\1.bin', FmOpenRead);
   OldString := 'RIFF';
   n:=1;
   SizeFile := GetFileSize(FHandle, nil);
   for l := 0 to SizeFile - Length(oldstring) do
   begin
     FileSeek(FHandle, l, 0);
     FileRead(FHandle, oldstring[1], 4);
     if oldstring = 'RIFF' then
     begin
       FileSeek(FHandle, l + 4, 0);
       Memo1.Lines.Add(IntToStr(l));
       FileRead(FHandle, SIZE, 4);
       Memo1.Lines.Add(IntToStr(SIZE));
       FileSeek(FHandle, l , 0);

//тут сильно лажовый код =)
       FileRead(FHandle,BytesRW,size);

    FSave := CreateFile(pchar('_out'+Int2Digs(N, 4)+'.bmp'), GENERIC_WRITE,
0, nil, CREATE_ALWAYS, 0, 0);
    WriteFile(FSave, BytesRW, SizeOf(BytesRW), RW, nil);
    CloseHandle(FSave);
//вот

      n:=n+1;

     end;
     Application.ProcessMessages;
   end;
   CloseHandle(FHandle);
end;

Последний раз редактировалось Jim_Di; 26.05.2009 в 15:24..
 
Ответить с цитированием

  #2  
Старый 31.05.2009, 18:39
intNet
Познающий
Регистрация: 31.05.2009
Сообщений: 68
С нами: 8919750

Репутация: 19
По умолчанию

Цитата:
надо скопировать с указанного места кусок нужной длины и сохранить в файл
Вот :
Код:
procedure _copy(FileNameIn: string ;// путь к входному файлу
 const FileNameOut: string;         // путь к выходному файлу
  place,   // позиция, откуда начать копировать
    tocopy: integer); // сколько символов копировать
var
  fin, fout: System.Text;
  _in, _out: string;
  s: string;
begin
  If not FileExists(FileNameIn) then
    exit;
  AssignFile(fin, FileNameIn);
  reset(fin);
  AssignFile(fout, FileNameOut);
  rewrite(fout);
  _in:='';
  _out:='';
  while not EOF(fin) do begin
    readln(fin, _in);
    _out:=_out+_in;
  end;
  s:=copy(_out, place, tocopy);
  writeln(fout, s);
  CloseFile(fin);
  CloseFile(fout);
end;
П.С. не самый шустрый алгоритм, писал "на коленке", но должно работать.
 
Ответить с цитированием

  #3  
Старый 31.05.2009, 18:52
Jim_Di
Познающий
Регистрация: 20.11.2008
Сообщений: 32
С нами: 9196320

Репутация: 39
По умолчанию

Спасибо за совет, думаю тое пригодиься кусок, гораздо проще и удобнее оказалось сделать TFileStream, там и придумывать ничего не надо - всё необходимое есть.
 
Ответить с цитированием

  #4  
Старый 01.06.2009, 00:33
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами: 10097606

Репутация: 3349


По умолчанию

А вообще тут всё проще делается на API и выйдет примерно так
f1=CreateFile на чтение
f2=CreateFile на запись
SetFilePointer для f1 на нужную тебе позицию
GetMem чтобы выделить память под буфер размером чтобы вместились твои данные
ReadFile f1
WriteFile f2
CloseHandle f1
CloseHandle f2
FreeMem
 
Ответить с цитированием

  #5  
Старый 01.06.2009, 07:30
Jim_Di
Познающий
Регистрация: 20.11.2008
Сообщений: 32
С нами: 9196320

Репутация: 39
По умолчанию

вот за апи спасибо, попробую и так.

в принципе сейчас код работает нормально, парюсь с ускорением алгоритма поиска набора байт в файле
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
МикроДжоинер для начинающих ReanimatoR Статьи 23 02.01.2010 15:07



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.