При работе с текстовыми файлами в среде разработки Delphi, разработчики часто сталкиваются с проблемой появления дополнительной пустой строки в конце файла. Это может быть неприятным сюрпризом, особенно если такая строка не нужна и мешает дальнейшей обработке данных. Рассмотрим, как решить эту проблему на примере класса TStrings, который используется для работы со списками строк.
Проблема
Когда мы используем метод TStrings.LoadFromFile для чтения содержимого файла и затем применяем TStrings.SaveToFile для записи данных обратно в файл, может появиться дополнительная пустая строка в конце файла. Это происходит даже в случае, если в исходном файле такая строка отсутствовала.
Пример кода, демонстрирующего проблему:
var
Lines : TStrings;
begin
Lines := TStringList.Create;
try
Lines.LoadFromFile('.\input.txt');
// ...
Lines.SaveToFile('.\output.txt');
finally
Lines.Free;
end;
end;
Решение для Delphi 10.1 и новее
В версиях Delphi 10.1 (Berlin) и новее, проблема может быть решена с помощью свойства TrailingLineBreak. Это свойство по умолчанию установлено в True, что означает, что текст будет содержать символ перевода строки после последней строки. Если установить это свойство в False, то перевода строки в конце текста не будет.
Lines.TrailingLineBreak := False;
Альтернативное решение для старых версий Delphi
Для старых версий Delphi, например, Delphi 2007 или Delphi XE7, можно создать подкласс TStringList и переопределить виртуальную функцию GetTextStr. Это позволит контролировать, будет ли в тексте присутствовать дополнительный перевод строки.
uses
Classes;
type
TMyStringList = class(TStringList)
private
FIncludeLastLineBreakInText : Boolean;
protected
function GetTextStr: string; override;
public
constructor Create(AIncludeLastLineBreakInText : Boolean = False); overload;
property IncludeLastLineBreakInText: Boolean read FIncludeLastLineBreakInText write FIncludeLastLineBreakInText;
end;
// Реализация класса TMyStringList
// ...
Пример использования созданного класса:
procedure TForm1.Button1Click(Sender: TObject);
var
Lines : TStrings;
begin
Lines := TMyStringList.Create(False);
try
Lines.LoadFromFile('.\input.txt');
Lines.SaveToFile('.\output.txt');
finally
Lines.Free;
end;
end;
Дополнительные решения
Также было предложено просто обрезать последний символ строки, используя метод Trim:
Lines.Text := Trim(Lines.Text);
Однако, этот подход не учитывает все возможные варианты строки перевода, включая различное количество пробелов в конце строки или другие символы, которые могут быть использованы для обозначения перевода строки.
Заключение
Как видно из вышеизложенного, существует несколько способов справиться с проблемой дополнительной строки при работе с TStrings в Delphi. Выбор конкретного решения зависит от версии используемой среды разработки и конкретных требований проекта.
При работе с текстовыми файлами в среде разработки Delphi, разработчики могут столкнуться с необходимостью удаления дополнительной пустой строки при использовании класса `TStrings`, что является распространенной проблемой при сохранении файлов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS