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

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

СообщениеДобавлено: 16.02.2025 20: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 21:46:34
Alexx2000
Вроде это особенность TStringList. Насколько я помню, данное поведение управляется свойством SkipLastLineBreak.

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

СообщениеДобавлено: 16.02.2025 21:55:51
iskander
Alexx2000 писал(а):данное поведение управляется свойством SkipLastLineBreak.

Даже двумя, есть ещё TStrings.TrailingLineBreak.
Только не спрашивайте меня, зачем стринглисту целых два свойства по столь пустяковому поводу.

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

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

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

СообщениеДобавлено: 17.02.2025 09: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 10:37:26
iskander
Можно ещё
Код: Выделить всё
  StringList.Options := StringList.Options - [soTrailingLineBreak];

xchgeaxeax писал(а):По поводу этого второго свойства есть комментарий.

Идиотизм с комментарием лучше чем без комментария?

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

СообщениеДобавлено: 17.02.2025 11:03:31
Снег Север
iskander писал(а):Идиотизм с комментарием лучше чем без комментария?

"Всё то вздор, чего не знает наш Митрофанушка!" (С)

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

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

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

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

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

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

Так издревле вел себя TStringList в Delphi.

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

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

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

СообщениеДобавлено: 19.02.2025 18:48:52
Alexander
Возьмём файл t.txt
Код: Выделить всё
a
b
c


Без переноса после "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 11:13:47
Снег Север
Претензии к wc в ваших линухах. Впрочем, в русской инструкции написано прямо, что строки она считает по числу символов перевода строки. Хотите получать правильный разбор на строки - правильно формируйте текстовый файл.