Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разбить текстовый файл [D7, WinXP]


Viktop ©   (2005-12-19 21:15:00) 

Как можно разбить текстовый файл на несколько равных (приблизительно) частей. Например, по 10 кило.


Viktop   (2005-12-21 04:56:00) [1]

Спасибо. Маленько подправил и получил:
procedure TfmMain.Button3Click(Sender: TObject);
const
 sz = 20480;
var
 fs1, fs2: TFileStream;
 i: Integer;
begin
 i := 0;
 fs1 := TFileStream.Create('c:\main.txt', fmOpenReadWrite);
 fs1.Position := 0;
 while fs1.Position <= fs1.Size do
 begin
   fs2 := TFileStream.Create(IntToStr(i) + '.txt', fmCreate);
   if fs1.Size - fs1.Position < sz then
   begin
     fs2.CopyFrom(fs1, fs1.Size - fs1.Position);
     fs2.Free;
     fs1.Free;
     exit;
   end
   else
     fs2.CopyFrom(fs1, sz);
   fs2.Free;
   Inc(i);
 end;
 fs1.Free;
end;

Он, скорее всего не совсем верен (условие), но иначе выдавалась ошибка


Eraser   (2005-12-20 21:19:00) [2]


> Viktop   (20.12.05 21:05) [3]

Читай ещё раз справку по TFileStream и по TStringList. К чему тут TStringList вообще не понятно!
Никаких Seek не нужно. Можно обойтись двумя TFileStream.
Примерно так (не проверял, возможны ошибки)

fs1 := TFileStream.Create('c:\main.txt', fmOpenReadWrite);
fs1.Position := 0;
while fs1.Position <= f.Size do
begin
  fs2 := TFileStream.Create('IntToStr(i) + '.txt', fmCreate);
  fs2.CopyFrom(fs1, sz);
  fs2.Free;
  Inc(i);
end;
fs1.Free;


Viktop   (2005-12-20 21:05:00) [3]

Написал такой код
[quote]procedure TfmMain.Button1Click(Sender: TObject);
const
 sz = 20480;
var
 f, f2: TFileStream;
 fl: TStringList;
 buf: array[0..sz] of char;
 i: Integer;
begin
 i := 0;
 f := TFileStream.Create('c:\1.txt', fmOpenReadWrite);
 fl := TStringList.Create();
 while f.Position <= f.Size do
 begin
   f.Seek(sz, soFromCurrent);
   f.Read(buf, sz);
   fl.Text := buf;
   fl.SaveToFile('C:\1_' + IntToStr(i) + '.txt');
   Inc(i);
 end;
 f.Free;
end;[/quote]
Но почему-то не совсем правильно работает. Файл с именем 1_0.txt содержит текст не с самого начала, а последний файл не до конца.
Текст в кодировке DOS. Т.е., если посмотреть суммарный размер полученных файлов, то он будет в 2 раза меньше оригинала


Viktop   (2005-12-20 07:13:00) [4]

Что-то типа этого
var
f:TFileStream;
buf: array[0..maxInt] of char; // Буфер, для хранения прочитанных данных
begin
f:= TFileStream.Create(‘c:\filename.txt’, fmOpenReadWrite);
f.Seek(10240, soFromCurrent);
f.Read(buf, 10240);
f.Free;
end;

Вроде бы должно работать. Сам не проверял. Я праквильно посчитал 10240 символов - 10 кило?


Eraser   (2005-12-19 21:18:00) [5]


> Viktop   (19.12.05 21:15)

С помощью TFileStream и его методов Read и Write.


Наверх

Титульная страница Поиск, карта сайта Написать письмо