MGAlex
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Добрый день. Столкнулся с проблемой записи строки (строковой переменной) в поток TFileStream и, соответственно, чтения этой строки из потока на Delphi 11 Alexandria. После считывания получаю в конце строки иероглифы. Записываю так: Код: procedure TForm1.Button1Click(Sender: TObject); var fs: TFileStream; S: String; d: Integer; begin S := 'Мой какой-то определенный текст, который может быть разной длины и все такое прочее'; fs := TFileStream.Create('c:\MyFile.dat', fmCreate or fmOpenWrite); d := Length(S) * SizeOf(Char); //AnsiChar - без разницы. fs.WriteBuffer(d, SizeOf(d)); fs.WriteBuffer(S[1], d); //можно вместо S[1] использовать Pointer(S)^ fs.Free; end; | Считываю так: Код: procedure TForm1.Button2Click(Sender: TObject); var fs: TFileStream; S: String; d: Integer; begin fs := TFileStream.Create('C:\MyFile.dat', fmOpenRead); fs.ReadBuffer(d, SizeOf(d)); SetLength(S, d); fs.ReadBuffer(S[1], d); Label1.Caption := S; fs.Free; end; | Самое интересное, что пример приведенный Embarcadero, нерабочий. Код: procedure caststring; var fs: TFileStream; const s: string = 'Hello'; begin fs := TFileStream.Create('temp.txt', fmCreate or fmOpenWrite); fs.Write(s, Length(s));// this will give you garbage fs.Write(PChar(s)^, Length(s));// this is the correct way end; | Мало того, что добавляются иероглифы, так еще и строка обрезается. Как я понимаю, проблема в неверно указанном размере строки. В Интернете нашел разные варианты, но ни один из них не решает проблему. Подскажите, пожалуйста, как верно указать размер строки, чтобы не было этой проблемы? Заранее спасибо. | Всего записей: 1855 | Зарегистр. 12-10-2007 | Отправлено: 12:06 12-11-2023 | Исправлено: MGAlex, 12:27 12-11-2023 |
|