Страница 1 из 1

TStringList - баг или фича ?

Добавлено: 16.02.2025 19:50:04
Alexander
В основном не использовал классы при загрузке/сохранении, но решил попробовать.

Возник вопрос, почему TStringList сохраняет лишнюю строку. Или так он и задуман ?

Код: Выделить всё

{$MODE OBJFPC}{$H+}
uses classes;
var
  Lines: TStringList;
begin
Lines := TStringList.Create;
Lines.LoadFromFile('a.txt');
Lines.SaveToFile('b.txt');
Lines.Free;
end.
Если в файле a.txt нет ничего, то и b.txt имеет нулевую длину. Но если в a.txt добавить хоть одну латинскую букву, то в b.txt появится лишний перевод строки. Или это особенность моей версии компилятора ?

Re: TStringList - баг или фича ?

Добавлено: 16.02.2025 20:46:34
Alexx2000
Вроде это особенность TStringList. Насколько я помню, данное поведение управляется свойством SkipLastLineBreak.

Re: TStringList - баг или фича ?

Добавлено: 16.02.2025 20:55:51
iskander
Alexx2000 писал(а):данное поведение управляется свойством SkipLastLineBreak.
Даже двумя, есть ещё TStrings.TrailingLineBreak.
Только не спрашивайте меня, зачем стринглисту целых два свойства по столь пустяковому поводу.

Re: TStringList - баг или фича ?

Добавлено: 16.02.2025 21:31:05
Alexander
Спасибо!

Re: TStringList - баг или фича ?

Добавлено: 17.02.2025 08:50:58
xchgeaxeax
iskander писал(а):Только не спрашивайте меня, зачем стринглисту целых два свойства по столь пустяковому поводу.

Код: Выделить всё

    // Same as SkipLastLineBreak but for Delphi compatibility. Note it has opposite meaning.
    Property TrailingLineBreak : Boolean Read GetTrailingLineBreak Write SetTrailingLineBreak;
По поводу этого второго свойства есть комментарий.

Re: TStringList - баг или фича ?

Добавлено: 17.02.2025 09:37:26
iskander
Можно ещё

Код: Выделить всё

  StringList.Options := StringList.Options - [soTrailingLineBreak];
xchgeaxeax писал(а):По поводу этого второго свойства есть комментарий.
Идиотизм с комментарием лучше чем без комментария?

Re: TStringList - баг или фича ?

Добавлено: 17.02.2025 10:03:31
Снег Север
iskander писал(а):Идиотизм с комментарием лучше чем без комментария?
"Всё то вздор, чего не знает наш Митрофанушка!" (С)

Re: TStringList - баг или фича ?

Добавлено: 18.02.2025 06:56:47
Alexander
Я бы сказал, что поведение по умолчанию удивляет. Лучше бы сделали наоборот: сразу сохраняет привычным способом, а кому нужно необычное - включает его. Как-то по логике: если мы загрузили файл и потом его же сохранили он должен оставаться неизменным, а всё остальное специальный случай.

Re: TStringList - баг или фича ?

Добавлено: 18.02.2025 07:45:16
Снег Север
Поведение стринглиста связано с механизмом разбиения текста на отдельные строки. А кто гонится за неизменностью должен использовать бинарный формат данных.

Re: TStringList - баг или фича ?

Добавлено: 18.02.2025 11:49:19
v-t-l
Alexander писал(а):Я бы сказал, что поведение по умолчанию удивляет.
Так издревле вел себя TStringList в Delphi.

Re: TStringList - баг или фича ?

Добавлено: 19.02.2025 12:09:39
Снег Север
Не могу понять претензий - если помнить, что задача стринглиста - представлять текст в виде массива строк, а признак конца строки - LineBreak, то поведение компонента совершенно логично. Если кто-то считает, что последняя строка не должна иметь признака конца, то это его личные проблемы.

Re: TStringList - баг или фича ?

Добавлено: 19.02.2025 18:48:14
Alexander
Возьмём файл t.txt Без переноса после "c".

И применим два способа посчитать количество строк в файле из Интернета.

Код: Выделить всё

wc -l t.txt

Код: Выделить всё

awk 'END{print NR}' t.txt
Результат удивит.
Так что как считать: вопрос не такой простой, а до сих пор спорный. Очевидно, что в файле 3 строки, но wc выдаст 2, а awk 3.

Добавлено спустя 59 минут 22 секунды:
Когда EOF исчез из файлов и возник этот спор ведь тогда такой файл это последовательность 'a'#10'b'#10'c'#26, а до этого и спора не могло возникнуть. Замечу дополнительно, что среди строк есть такая строка, как пустая. Тогда 'a'#10'b'#10'c'#10#26 её бы и предполагал в качестве последней.

Re: TStringList - баг или фича ?

Добавлено: 20.02.2025 10:13:47
Снег Север
Претензии к wc в ваших линухах. Впрочем, в русской инструкции написано прямо, что строки она считает по числу символов перевода строки. Хотите получать правильный разбор на строки - правильно формируйте текстовый файл.