ReadStr() и WriteStr() в Delphi

У меня есть код, который использует ReadStr и WriteStr для того, что я полагаю, записывает строку в двоичный файл.

Объяснение WriteStr в документации гласит, что необработанные данные будут записываться в форме AnsiString в поток объекта, что имеет смысл. Но потом ReadStr говорит, что читает символ. Так разве они не противоположны друг другу?

Допустим, у меня есть,

pName: String[80];

и я использую WriteStr на нем, что он на самом деле пишет? Поскольку WriteStr ожидает AnsiString, приводит ли он pName к такому типу? В этом случае не записывает ли он поле «Длина» в поток, потому что указатель AnsiString указывает на первый элемент, а не на поле длины? Я также искал, и в наши дни кажется, что String == AnsiString, но мой вопрос о поле длины остается прежним.

Если, допустим, он не записывает поле «Длина» в файл, он по-прежнему записывает NULL в конце данных? Таким образом, могу ли я найти, где заканчивается строка, ища «\ 0»? Читает ли ReadStr до символа NULL?

Спасибо любезно :)


person Mewa    schedule 19.06.2013    source источник
comment
Очень сложно сказать, что делают эти функции. Возможно, если бы вы показали код для них, у нас было бы больше шансов.   -  person David Heffernan    schedule 19.06.2013
comment
Это TWriter.WriteStr и TReader.ReadStr? Они помечены как предназначенные только для внутреннего использования.   -  person LU RD    schedule 19.06.2013
comment
@DavidHeffernan, они, как упомянул LU RD, на самом деле TReader.ReadStr и TWriter.WriteStr. У меня нет кода для этих функций, поскольку они встроены, и доступны только короткие фрагменты, объясняющие их назначение.   -  person Mewa    schedule 19.06.2013
comment
@LURD, я не тот, кто использовал эти функции, но мне нужно выяснить, что делает код. Поэтому, хотя я читал, что они предназначены только для внутреннего использования, кажется, эти ребята все равно их использовали :/   -  person Mewa    schedule 19.06.2013
comment
У вас нет исходного кода Delphi RTL?   -  person David Heffernan    schedule 19.06.2013
comment
Не заставляйте нас гадать, пожалуйста. ReadStr? ReadStr?   -  person OnTheFly    schedule 19.06.2013
comment
@user539484 user539484 Ну, я полагаю, мы можем исключить тот, который не является частью Delphi.   -  person David Heffernan    schedule 19.06.2013
comment
@ user539484, я подумал, что Delphi в названии было бы достаточно, чтобы объяснить, что это не Pascal.   -  person Mewa    schedule 19.06.2013
comment
Почему минус? Это выглядит как правильный вопрос.   -  person Leonardo Herrera    schedule 19.06.2013


Ответы (1)


В вашей версии Delphi до Unicode WriteStr и ReadStr записывают и считывают значение AnsiString. Код записи записывает длину, а затем содержимое строки. Код чтения считывает длину, выделяет строку, а затем заполняет ее содержимым.

Это может привести к усечению, когда вы присваиваете результат ReadStr своей короткой строке из 80 символов.

person David Heffernan    schedule 19.06.2013
comment
Спасибо! Так что поле длины все еще там, это полезно знать. А остальные поля? Структура AnsiString содержит 32-битный индикатор длины, 32-битный счетчик ссылок, 16-битную длину данных, указывающую количество байтов на символ, и 16-битную кодовую страницу. Из этого описания кажется, что нужно написать больше информации, или она просто опущена? - person Mewa; 19.06.2013
comment
Эту информацию не нужно записывать, а часть ее даже отсутствует в вашей версии Delphi до Unicode. Например, счетчик ссылок не имеет значения в файле, только в памяти. - person David Heffernan; 19.06.2013
comment
Хорошо, это имеет смысл, спасибо! Я думаю, что я могу взять это отсюда :) - person Mewa; 19.06.2013