ここの掲示板でバイナリの保存をやってた人がいたので
読み込みをやってみようと思ったんですが、
文字列のバイナリデータを読み込めなくて困っています。
ReadBuffer内のLength(s)が0になっているみたいで、
edit1には何も代入されません。
どなたか、解決策を教えてくれませんか?お願いします。
procedure TForm1.Button2Click(Sender: TObject);
var
fs: TFileStream;
s: string;
begin
fs := TFileStream.Create('D:\test.txt', fmOpenRead);
try
fs.ReadBuffer(PChar(s)^, Length(s));
Edit1.Text := s;
finally
fs.Free;
end;
end;
変数sのLengthを渡していますが、さて、この文字列型変数sの中身はどうなっていますか。
また、その長さはいくつでしょうか。
sの中身は''ですね。
その長さLength(s)は、0です。
それらをふまえて、ヘルプにある
> ストリームからバッファに Count バイトを読み出すことができます。
を考えてみてください。
「0バイト読み出す」ということになります。
つまり、バッファ領域は、自分で用意する事になります。
SetLength, GetMem, FreeMemなどを参照してください。
文字列バッファを扱うときは、String型文字列より、
Char型の文字の配列(array of Char)のほうがやりやすいですよ。
文字列型変数sを長くして、長さを1以上にすることもできます…けど、
最初からChar型配列でやったときと比べると、コードの量がすごく違ってしまいます。
PChar型変数も使えそうですね。お好きなほうをどうぞ・・・です。
(この場合はPCharが一番楽かな?)
質問とは関係ないですけど、
にしのさんの解説は、とてもわかりやすくていいですね。
そういう説明のしかたを見習いたいものです(^^ゞ
にしのさん、たかみさん、ありがとうございました。
SetLengthだけ加えても、文字列すべて読み込むことができないので、ちょっと付け加えたらうまく読み込めました。
保存用のほうもデータが合うように変えました。
fs := TFileStream.Create('D:\test.txt', fmOpenRead);
try
fs.ReadBuffer(i, SizeOf(i));
SetLength(s, i);
fs.ReadBuffer(PChar(s)^, i);
Memo1.Text := s;
finally
fs.Free;
end;
ツイート | ![]() |