Показать сообщение отдельно
  #1  
Старый 03.02.2018, 23:37
Taras2020 Taras2020 вне форума
Прохожий
 
Регистрация: 15.01.2018
Сообщения: 36
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Разбиение текста на Delphi

И вот вопрос: Есть один минус и сразу вопрос: Как сделать что бы если количество строк не кратно количеству частей то последний файл меньше ?. То есть пусть все первые файлы равны, последний меньше.

Потому что в данном случае делит не правильно.

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  //Количество частей на которые надо разбить файл.
  N = 10;
var
  F1, F2 : File;
  i, SizePart, SizePartAdd : Cardinal;
  Buff : array of Byte;
begin
  if OpenDialog1.InitialDir = '' then begin
    OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
  end;
  if not OpenDialog1.Execute then Exit;
  if not FileExists(OpenDialog1.FileName) then begin
    ShowMessage('Указанный файл не найден. Действие отменено.');
    Exit;
  end;

  AssignFile(F1, OpenDialog1.FileName);
  Reset(F1, 1);

  if FileSize(F1) < N then begin
    ShowMessage('Указанный файл слишком мал. Разбиение отменено.');
    CloseFile(F1);
    Exit;
  end;

  SizePart := FileSize(F1) div N;
  SizePartAdd := FileSize(F1) mod N;

  SetLength(Buff, SizePart);

  for i := 1 to N do begin
    AssignFile(F2, OpenDialog1.FileName + '.part' + IntToStr(i));
    Rewrite(F2, 1);
    BlockRead(F1, Pointer(Buff)^, SizePart);
    BlockWrite(F2, Pointer(Buff)^, SizePart);
    if (i = N) and (SizePartAdd > 0) then begin
      BlockRead(F1, Pointer(Buff)^, SizePartAdd);
      BlockWrite(F2, Pointer(Buff)^, SizePartAdd);
    end;
    CloseFile(F2);
  end;

  CloseFile(F1);
end;
Ответить с цитированием