Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
ВнизРазбить текстовый файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c