バイナリの読み込み

解決


kuma9  2003-02-09 12:38:01  No: 2857  IP: 192.*.*.*

ここの掲示板でバイナリの保存をやってた人がいたので
読み込みをやってみようと思ったんですが、
文字列のバイナリデータを読み込めなくて困っています。
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;

編集 削除
にしの  2003-02-09 14:27:24  No: 2858  IP: 192.*.*.*

変数sのLengthを渡していますが、さて、この文字列型変数sの中身はどうなっていますか。
また、その長さはいくつでしょうか。

sの中身は''ですね。
その長さLength(s)は、0です。
それらをふまえて、ヘルプにある
> ストリームからバッファに Count バイトを読み出すことができます。
を考えてみてください。
「0バイト読み出す」ということになります。

つまり、バッファ領域は、自分で用意する事になります。
SetLength, GetMem, FreeMemなどを参照してください。

編集 削除
たかみちえ  URL  2003-02-09 14:39:58  No: 2859  IP: 192.*.*.*

文字列バッファを扱うときは、String型文字列より、
Char型の文字の配列(array of Char)のほうがやりやすいですよ。

  文字列型変数sを長くして、長さを1以上にすることもできます…けど、
最初からChar型配列でやったときと比べると、コードの量がすごく違ってしまいます。
PChar型変数も使えそうですね。お好きなほうをどうぞ・・・です。
(この場合はPCharが一番楽かな?)


  質問とは関係ないですけど、
  にしのさんの解説は、とてもわかりやすくていいですね。
そういう説明のしかたを見習いたいものです(^^ゞ

編集 削除
kuma9  2003-02-09 17:23:40  No: 2860  IP: 192.*.*.*

にしのさん、たかみさん、ありがとうございました。
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;

編集 削除