![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбить текстовый файл [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.