Delphiの文字型 char に対する質問です。

解決


あすなろⅤ  2016-12-03 03:30:04  No: 48437

type
  CharArray = array[0..8191] of Char;

function ReadMyFile(R_Name): Boolean;
var
  ReadF  : TFileStream;
  NumRead: Integer;
begin
   ReadF := TFileStream.Create(R_Name, fmOpenRead or fmShareExclusive);
   WriteF := TFileStream.Create(W_Name, fmCreate or fmShareExclusive);

   repeat
     NumRead := ReadF.Read(Buf, SizeOf(Buf));
     WriteF.Write(Buf, NumRead);
   until NumRead <> SizeOf(Buf);

end;

  Char 型って文字型ですよね。任意のファイルを読み込むとき、buf には 0x00 ~ 0x1f の制御コードも読み込まれることがありうると思うのですが、Char 型の配列である buf できちんと保存できるのはなぜでしょうか。制御コードは文字としては表示できないはずなので、その辺がわからないのです。また

  CharArray = array[0..8191] of Byte;

ならともかく、わざわざ

  CharArray = array[0..8191] of Char;

としている理由がわかりにくいです。


通りすがり  2016-12-03 06:21:19  No: 48438

TFileStreamのRead/Writeメソッドは

http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.Classes.THandleStream.Read
http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.Classes.THandleStream.Write

にあるとおり引数として型なしパラメータ

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%EF%BC%88Delphi%EF%BC%89#.E5.9E.8B.E3.81.AA.E3.81.97.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF

をとります。これは実際にはパラメータのアドレスがRead/Writeに渡され、そのアドレスが処理対象になります。
つまりそこに必要なサイズのメモリ領域が正しく確保されていれば、その領域がどのような型なのかは関係ないのです。
ただし指摘の通りで、CharがDelphiのバージョンによりAnsiCharとWideCharのどちらかにマッピングされるため、
array [] of Charではなくarray of Byteのほうが望ましいのは確かです(Delphi 2009以降ではChar=WideCharなので
バッファは8192バイトではなく16384バイト確保されます)。


あすなろⅤ  2016-12-03 06:58:52  No: 48439

素早い回答、まことにありがとうございます。とても勉強になりました。
  リンク先の説明もしっかり読んで、理解を深めようと思います。

  使っているのは化石のような Delphi5 です。Delphi5 は当時 5 万くらいで購入しました。
  今の Delphi は高くなりましたね。


通りすがり  2016-12-03 07:53:32  No: 48440

ソースは付いてないけどStarterエディションは無料になりましたよ。
是非新しいDelphiも試してみてください。


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

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






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