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


Автор: ShadowDancer 27.10.2007, 23:29
Читаю файл вот так:
Код

procedure CopyPart(FromFile, ToFile: string);
var
 FromF, ToF: file;
 NumRead, NumWritten, i: Integer;
 Buf: array[1..524288] of Char;
begin
 AssignFile(FromF, FromFile);
 Reset(FromF, 1);
 Seek(FromF, 1024*1024*2);
 AssignFile(ToF, ToFile);
 Rewrite(ToF, 1);
 //repeat
  //BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
  //BlockWrite(ToF, Buf, NumRead, NumWritten);
 //until (NumRead = 0) or (NumWritten <> NumRead);
 for i := 1 to 4 do
 begin
  BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
  BlockWrite(ToF, Buf, NumRead, NumWritten);
  if (NumRead = 0) or (NumWritten <> NumRead) then Break;
 end;
 CloseFile(FromF);
 CloseFile(ToF);
end;


когда я делаю Seek(FromF, 1024*1024*2); а потом сохраняю, то файл с нулевыми байтами получается, а если поставить Seek чуть по меньше, то всё ОК... как быть, чтобы нормально считывался файл ?

Автор: VICTAR 27.10.2007, 23:44
Какого размера файл? Если есть возможность, то может стоит его приложить к коду?

Автор: ShadowDancer 27.10.2007, 23:49
Обычный видео-файл, размер 26 мегов.

Автор: ShadowDancer 28.10.2007, 10:31
Эмм... У вас нормально считывает ?

Автор: kristalik 28.10.2007, 20:16
файловыми патоками воспользуйся : пример в любом учебнике.

а зачем {Seek(FromF, 1024*1024*2);}  прыгаеш на на начало 3 мегобайта?

Автор: ShadowDancer 28.10.2007, 20:19
Пробовал через мемори стрим сделать - всё равно не получается ((
Мне вообще нужно сохранить на диск маленький кусочек большого файла.

Добавлено через 3 минуты и 2 секунды
Прыгаю из-за того что мне нужно сохранить на диск не первые 2мб файла, а 2мб, которые находятся после позиции в 1024*1024*2

Автор: kristalik 28.10.2007, 20:28
Код

procedure copyfile(in,out:string;nachalo,kones:int);{nachaloначальный блок,kones- конечный блок, размер блока 1 байт}
var sin,sout:TFilestream;

begin
   sin=TfileStream.create(in,fmopenread);
   sout=TfileStream.create(out,fmopenwrite or fmCreate);
sin.position=nachalo;
   sout.copyform(sin,nachalo-kones);
sout.free;
sin.free;
end;


Добавлено через 8 минут и 51 секунду
учти копирование производится имеенно в формате символьного файла, а не вырезка фрогмента видеео.

Автор: ShadowDancer 28.10.2007, 21:10
Трохи поправил процедурку, т.к. не компилися твоя
Код

procedure copyfile_(inF, outF:string;nachalo, kones:integer);{nachaloíà÷àëüíûé áëîê,kones- êîíå÷íûé áëîê, ðàçìåð áëîêà 1 áàéò}
var
  sin,sout:TFilestream;
begin
 sin := TfileStream.create(inF, fmopenread);
 sout := TfileStream.create(outF, fmopenwrite or fmCreate);
 sin.position := nachalo;
 sout.copyfrom(sin, kones-nachalo);
 sout.free;
 sin.free;
end;


Вызываю вот так: 
CopyFile_('F:\Имя_большого_фильма.avi', 'test.txt', 1024*1024, 1024*1024*2);
В резльтате в test.txt, получается вовсе не то содержимое что находится по этим позициям в большом файле. На мальньких файлах всё работает отлично (даже с той процедурой, которую я использовал). Проверьте пожалуйста, у вас код корректно работает ?

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