烽火社区

标题: 通过内存流读取文件 [打印本页]

作者: MiStrong    时间: 2016-2-29 09:42 PM
标题: 通过内存流读取文件
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);
    procedure Button1Click(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; begin   strList := TStringList.Create;
  strList.Add(\'aaaaaaaa\');
  strList.Add(\'bbbbbbbb\');
  strList.Add(\'cccccccc\');
  strList.Add(\'dddddddd\');
  strList.SaveToFile(\'c:temptest.txt\');
  strList.Free;

  {同时建立内存流}   mStream := TMemoryStream.Create; end; procedure TForm1.Button1Click(Sender: TObject); //通过流读文件到 Memo begin   mStream.LoadFromFile(\'c:temptest.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.

作者: RedAdobe    时间: 2016-2-29 09:43 PM
楼主辛苦……感谢分享……
作者: pc_based    时间: 2016-2-29 09:44 PM
[attach]31628[/attach]
作者: leiyz    时间: 2016-2-29 09:46 PM
[attach]31629[/attach]




欢迎光临 烽火社区 (http://bbs.cnecport.com/) Powered by Discuz! X3.2