關於 Delphi 中流的使用(3) 通過記憶體流讀取檔案
阿新 • • 發佈:2022-01-21
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; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedureButton1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var mStream: TMemoryStream; procedure TForm1.FormCreate(Sender: TObject); //程式開始先建立一個準備要測試的檔案 var strList: TStringList; beginstrList := TStringList.Create; strList.Add('aaaaaaaa'); strList.Add('bbbbbbbb'); strList.Add('cccccccc'); strList.Add('dddddddd'); strList.SaveToFile('c:\temp\test.txt'); strList.Free; {同時建立記憶體流} mStream := TMemoryStream.Create; end; procedure TForm1.Button1Click(Sender: TObject); //通過流讀檔案到 Memobegin mStream.LoadFromFile('c:\temp\test.txt'); {把檔案讀入記憶體流} Memo1.Lines.LoadFromStream(mStream); {把記憶體流載入 Memo1} end; procedure TForm1.Button2Click(Sender: TObject); //用字元指標讀取流中的內容 var pc: PChar; begin pc := mStream.Memory; {把字元指標指向記憶體流} ShowMessage(pc[0]); {a; 第一個字元} ShowMessage(pc[10]); {b; 這個第二行的第一個字元; 每行8個字再加換行與回車共10個字元} ShowMessage(pc[20]); {c} ShowMessage(pc[30]); {d} end; procedure TForm1.Button3Click(Sender: TObject); //從流讀入到緩衝區 var buffer: array[0..2] of Char; {定義個字元緩衝區} begin mStream.Seek(0, soFromBeginning); mStream.Read(buffer, SizeOf(buffer)); ShowMessage(buffer); {aaa} mStream.Seek(10, soFromBeginning); mStream.Read(buffer, SizeOf(buffer)); ShowMessage(buffer); {bbb} mStream.Seek(20, soFromBeginning); mStream.Read(buffer, SizeOf(buffer)); ShowMessage(buffer); {ccc} mStream.Seek(30, soFromBeginning); mStream.Read(buffer, SizeOf(buffer)); ShowMessage(buffer); {ddd} {關於 Seek 函式: 引數1: Offset 是偏移量; 引數2: Origin 是指標的基準位置, 有三個選值: soFromBeginning、soFromCurrent、soFromEnd soFromBeginning: 以開始為基準, 此時引數 Offset 要 >= 0; soFromCurrent: 以當前位置為基準; soFromEnd: 以結束為基準; 此時引數 Offset 要 <= 0; 返回: 指標新位置 } end; procedure TForm1.FormDestroy(Sender: TObject); begin mStream.Free; end; end.