1. 程式人生 > >delphi中無型別檔案讀寫

delphi中無型別檔案讀寫

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  FileName = 'c:\temp\binary.dat';
var
  F: file;

//用無型別的方式寫入一個位元組
procedure TForm1.Button1Click(Sender: TObject);
var
  b: Byte;
begin
  AssignFile(F,FileName);
  Rewrite(F,1); //第二個引數表示: 把 1 個位元組當作一個寫入單位

  b := 65;
  BlockWrite(F,b,1); //寫入; 引數2是要寫入的內容; 引數3表示寫入 1 次.

  CloseFile(F);
//落實 binary.dat 的大小: 1個位元組; 內容: A (可用記事本開啟)
end;


//用無型別的方式讀出一個位元組
procedure TForm1.Button2Click(Sender: TObject);
var
  b: Byte;
begin
  AssignFile(F,FileName);
  Reset(F,1); //把 1 個位元組當作一個讀取單位

  BlockRead(F,b,1); //讀取一次; 放入 b
  ShowMessage(Chr(b)); //A

  CloseFile(F);
end;


//寫入更多位元組
procedure TForm1.Button3Click(Sender: TObject);
var
  buffer: array[0..127] of Byte;
  i: Integer; //儲存多個位元組, 需要用陣列了
begin
  for i := Low(buffer) to High(buffer) do
    buffer[i] := i; //給陣列賦值, 注意現在陣列大小是 128

  AssignFile(F,FileName);
  Rewrite(F,32); //規定把 32 個位元組當作一個讀取單位, 注意這個數字和緩衝區大小必須是倍數關係

  BlockWrite(F,buffer,4); //需要寫入幾次呢? 128/32=4

  CloseFile(F);
//寫成的檔案肯定是128位元組大小, 但用記事本可能看不了, 因為這個二進位制不是文字
end;


//讀出
procedure TForm1.Button4Click(Sender: TObject);
var
  buffer: array[0..127] of Byte;
  i: Integer;
begin
  AssignFile(F,FileName);
  Reset(F,4); //把 4 位元組當作一個讀取單位; 為了那個倍數關係, 這裡一般是 1

  BlockRead(F,buffer,32); //當然需要 32 次才能讀完

  CloseFile(F);

  //怎麼顯示一下呢? 還是用 Memo 吧; 顯示字元? 數字? 還是十六進位制吧
  Memo1.Clear;
  for i := Low(buffer) to High(buffer) do
  begin
    Memo1.Lines.Add(IntToHex(buffer[i],1));
  end;
(*顯示結果: 0 1 2 3 ... 7D 7E 7F *)

end;


//讀寫 Char 與實際讀寫位元組
procedure TForm1.Button5Click(Sender: TObject);
var
  cArr1,cArr2: array[0..4] of Char;
  i: Integer;
  num: Integer; //記錄實際讀寫的位元組數
begin
  for i := Low(cArr1) to High(cArr1) do
    cArr1[i] := Chr(65+i); //填充 A B C D E

  AssignFile(F,FileName);
  Rewrite(F,1); //建立

  BlockWrite(F,cArr1,Length(cArr1),num); //引數4: num 是實際寫入的位元組數
  ShowMessage(IntToStr(num)); //5

  Reset(F,1); //重新開啟

  BlockRead(F,cArr2,Length(cArr2),num); //引數5: num 是實際讀出的位元組數
  ShowMessage(IntToStr(num)); //5

  ShowMessage(cArr2); //ABCDE

  CloseFile(F);
end;


//寫入長字串, 讀出其十六進位制碼
procedure TForm1.Button6Click(Sender: TObject);
var
  p: PChar;
  b: Byte;
begin
  p := '萬一的 Delphi 部落格';

  AssignFile(F,FileName);     //關聯檔名
  Rewrite(F,1);               //建立並開啟
  BlockWrite(F,p,Length(p));  //寫入


  FileMode := fmOpenRead;     //這時可以設檔案為只讀
  Reset(F,1);                 //為讀取開啟

  Memo1.Clear;
  while not Eof(F) do
  begin
    BlockRead(F,b,1);
    Memo1.Text := Memo1.Text + IntToHex(b,2) + ' ';
  end;
  //顯示結果: 70 F0 45 00 08 F7 12 00 A6 FB 43 00 A0 1A E5 00 FF C5

  CloseFile(F);
end;


//複製個檔案
procedure TForm1.Button7Click(Sender: TObject);
var
  FromF,ToF: file;
  NumRead,NumWritten: Integer;
  Buffer: array[1..2048] of Byte;
begin
  AssignFile(FromF, 'c:\temp\test1.dat'); //假定有這個檔案
  Reset(FromF, 1);
  AssignFile(ToF, 'c:\temp\test2.dat');
  Rewrite(ToF, 1);

  repeat
    BlockRead(FromF, Buffer, SizeOf(Buffer), NumRead);
    BlockWrite(ToF, Buffer, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);
  { NumRead=0 表示讀完了; NumWritten <> NumRead 表示磁碟空間不夠了 }

  CloseFile(FromF);
  CloseFile(ToF);
end;

end.