Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: CL | DM;

Вниз

Разбить текстовый файл   Найти похожие ветки 

 
Viktop   (2005-12-19 21:15) [0]

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


 
Eraser ©   (2005-12-19 21:18) [1]


> Viktop   (19.12.05 21:15)

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


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

Что-то типа этого
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 кило?


 
Viktop   (2005-12-20 21:05) [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 раза меньше оригинала


 
Eraser ©   (2005-12-20 21:19) [4]


> 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-21 04:56) [5]

Спасибо. Маленько подправил и получил:
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;

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
2-1135039470
Neirooman
2005-12-20 03:44
2006.01.08
Курсор из файла


14-1134396057
VirEx
2005-12-12 17:00
2006.01.08
синхронизация потоков в API


2-1135035793
kizam
2005-12-20 02:43
2006.01.08
картинка на RichEdit-e


14-1134498337
Ксардас
2005-12-13 21:25
2006.01.08
Просьба


14-1134568925
VirEx
2005-12-14 17:02
2006.01.08
FoxMail - run dialup