• 关于 Delphi 中流的使用(3) 通过内存流读取文件


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

  • 相关阅读:
    Win10设置多时区时钟方法技巧
    Win10技巧:使用“照片”应用剪辑视频、添加特效
    kk录像机怎么剪辑视频 kk录像机视频剪辑教程
    360快剪辑怎么使用 360快剪辑软件使用方法介绍
    WPF HyperLink链接下划线隐藏
    ORACLE 如何产生一个随机数
    电脑的开始菜单点不了 用户帐户出现在桌面上
    无法加载DLL"***.dll":找不到指定的模块
    C#调用dll提示"试图加载格式不正确的程序"原因及解决方法
    C#中与C++中的 LPWSTR(wchar_t *) 对应的类型
  • 原文地址:https://www.cnblogs.com/xionda/p/15828391.html
Copyright © 2020-2023  润新知