Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1131020642
ne0n
2005-11-03 15:24
2006.01.08
и сново Hook(по ходу)


2-1135223968
kaginava
2005-12-22 06:59
2006.01.08
MDIForm


2-1135061079
Shtukos
2005-12-20 09:44
2006.01.08
Как скопировать в память канву


1-1133386958
ДНО
2005-12-01 00:42
2006.01.08
задача на оптимальное размещение


14-1134321526
Карелин Артем
2005-12-11 20:18
2006.01.08
А я в бассейне открытом плавал на днях в снег.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский