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

Проектирование и разработка идеального средства программирования.

Модератор: Модераторы

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

Сообщение Alexander » 16.02.2025 20:50:04

В основном не использовал классы при загрузке/сохранении, но решил попробовать.

Возник вопрос, почему 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 появится лишний перевод строки. Или это особенность моей версии компилятора ?
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 802
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение Alexx2000 » 16.02.2025 21:46:34

Вроде это особенность TStringList. Насколько я помню, данное поведение управляется свойством SkipLastLineBreak.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 489
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

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

Сообщение iskander » 16.02.2025 21:55:51

Alexx2000 писал(а):данное поведение управляется свойством SkipLastLineBreak.

Даже двумя, есть ещё TStrings.TrailingLineBreak.
Только не спрашивайте меня, зачем стринглисту целых два свойства по столь пустяковому поводу.
iskander
энтузиаст
 
Сообщения: 608
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Alexander » 16.02.2025 22:31:05

Спасибо!
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 802
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение xchgeaxeax » 17.02.2025 09:50:58

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

Код: Выделить всё
    // Same as SkipLastLineBreak but for Delphi compatibility. Note it has opposite meaning.
    Property TrailingLineBreak : Boolean Read GetTrailingLineBreak Write SetTrailingLineBreak;

По поводу этого второго свойства есть комментарий.
xchgeaxeax
постоялец
 
Сообщения: 150
Зарегистрирован: 11.05.2023 03:51:40

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

Сообщение iskander » 17.02.2025 10:37:26

Можно ещё
Код: Выделить всё
  StringList.Options := StringList.Options - [soTrailingLineBreak];

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

Идиотизм с комментарием лучше чем без комментария?
iskander
энтузиаст
 
Сообщения: 608
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Снег Север » 17.02.2025 11:03:31

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

"Всё то вздор, чего не знает наш Митрофанушка!" (С)
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Alexander » 18.02.2025 07:56:47

Я бы сказал, что поведение по умолчанию удивляет. Лучше бы сделали наоборот: сразу сохраняет привычным способом, а кому нужно необычное - включает его. Как-то по логике: если мы загрузили файл и потом его же сохранили он должен оставаться неизменным, а всё остальное специальный случай.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 802
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение Снег Север » 18.02.2025 08:45:16

Поведение стринглиста связано с механизмом разбиения текста на отдельные строки. А кто гонится за неизменностью должен использовать бинарный формат данных.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение v-t-l » 18.02.2025 12:49:19

Alexander писал(а):Я бы сказал, что поведение по умолчанию удивляет.

Так издревле вел себя TStringList в Delphi.
v-t-l
энтузиаст
 
Сообщения: 737
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Снег Север » 19.02.2025 13:09:39

Не могу понять претензий - если помнить, что задача стринглиста - представлять текст в виде массива строк, а признак конца строки - LineBreak, то поведение компонента совершенно логично. Если кто-то считает, что последняя строка не должна иметь признака конца, то это его личные проблемы.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Alexander » 19.02.2025 18:48:52

Возьмём файл 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 её бы и предполагал в качестве последней.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 802
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

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

Сообщение Снег Север » 20.02.2025 11:13:47

Претензии к wc в ваших линухах. Впрочем, в русской инструкции написано прямо, что строки она считает по числу символов перевода строки. Хотите получать правильный разбор на строки - правильно формируйте текстовый файл.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3050
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Компилятор / язык программирования

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru
cron