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;
としている理由がわかりにくいです。
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
にあるとおり引数として型なしパラメータ
をとります。これは実際にはパラメータのアドレスがRead/Writeに渡され、そのアドレスが処理対象になります。
つまりそこに必要なサイズのメモリ領域が正しく確保されていれば、その領域がどのような型なのかは関係ないのです。
ただし指摘の通りで、CharがDelphiのバージョンによりAnsiCharとWideCharのどちらかにマッピングされるため、
array [] of Charではなくarray of Byteのほうが望ましいのは確かです(Delphi 2009以降ではChar=WideCharなので
バッファは8192バイトではなく16384バイト確保されます)。
素早い回答、まことにありがとうございます。とても勉強になりました。
リンク先の説明もしっかり読んで、理解を深めようと思います。
使っているのは化石のような Delphi5 です。Delphi5 は当時 5 万くらいで購入しました。
今の Delphi は高くなりましたね。
ソースは付いてないけどStarterエディションは無料になりましたよ。
是非新しいDelphiも試してみてください。
ツイート | ![]() |