Использование TStream.WriteAnsiString

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Использование TStream.WriteAnsiString

Сообщение Padre_Mortius »

Почему или для чего при записи строки в файл через поток Stream в начале строки всегда пишется ее длина?

Код приведен из модуля streams.inc

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

Procedure TStream.WriteAnsiString (S : String);

  Var L : Longint;

  begin
    L:=Length(S);
    WriteBuffer (L,SizeOf(L));
    WriteBuffer (Pointer(S)^,L);
  end;


Это фича или баг?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

а как достающий из потока иначе узнает длинну извлекаемой строки ?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Об этом я как раз и не подумал. Но в тоже самое время если я пишу в файл информацию типа лога, которая должна быть визуальна (текстовая информация), то первые 4 байта немного мозолят глаза
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Если там только текст, то может TStringList лучше ?
v-t-l
энтузиаст
Сообщения: 745
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Или сразу

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

Stream.WriteBuffer(PChar(S),Length(S))
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

to v-t-l

Данный вариант уж был опробован. Результат = двоичные данные в файле.

А правильным вариантом является

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

Stream.WriteBuffer(Pointer(S)^, Length(S))
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Brainenjii писал(а):Если там только текст, то может TStringList лучше ?


Не проще. Держать в памяти компьютера несколько десятков тысяч строк лога (которые можно потерять в случае ошибки) или просто добавить запись в файл.
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

Padre_Mortius
в файл проще writeln сделать
Ответить