バイナリの読み込み

解決


kuma9  2003-02-09 21:38:01  No: 2857

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

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

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

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


たかみちえ  URL  2003-02-09 23:39:58  No: 2859

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

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

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


kuma9  2003-02-10 02:23:40  No: 2860

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加