zoukankan      html  css  js  c++  java
  • Delphi中文件流的使用方法

    在Delphi中,所有流对象的基类为TStream类,

    其中定义了所有流的共同属性和方法。
    TStream类中定义的属性介绍如下:

    1、Size: 此属性以字节返回流中数据大小。

    2、Position: 此属性控制流中存取指针的位置。

    Tstream中定义的虚方法有四个:
    1、Read:此方法实现将数据从流中读出。函数原形为:
    Function Read(var Buffer;Count:Longint):Longint;virtual;abstract;
    参数Buffer为数据读出时放置的缓冲区,Count为需要读出的数据的字节数,该方法返回值为实际读出的字节数,它可以小于或等于Count中指定的值。
    2、Write:此方法实现将数据写入流中。函数原形为:
    Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;
    参数Buffer为将要写入流中的数据的缓冲区,Count为数据的长度字节数,该方法返回值为实际写入流中的字节数。

    3、Seek:此方法实现流中读取指针的移动。函数原形为:
    Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
    参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:
    soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
    soFromCurrent:Offset为移动后指针与当前指针的相对位置。
    soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。
    该方法返回值为移动后指针的位置。
    4、Setsize:此方法实现改变数据的大小。函数原形为:
    Function Setsize(NewSize:Longint);virtual;
    另外,TStream类中还定义了几个静态方法:
    1、ReadBuffer:此方法的作用是从流中当前位置读取数据。函数原形为:

    Procedure ReadBuffer(var Buffer;Count:Longint);
    参数的定义跟上面的Read相同。注意:当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
    2、WriteBuffer:此方法的作用是在当前位置向流写入数据。函数原形为:
    Procedure WriteBuffer(var Buffer;Count:Longint);
    参数的定义跟上面的Write相同。注意:当写入的数据字节数与需要写入的字节数不相同时,将产生EWriteError异常。
    3、CopyFrom:此方法的作用是从其它流中拷贝数据流。函数原形为:
    Function CopyFrom(Source:TStream;Count:Longint):Longint;
    参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据;
    TStream还有其它派生类,其中最常用的是TFileStream类。使用TFileStream类来存取文件,首先要建立一个实例。声明如下:
    constructor Create(const Filename:string;Mode:Word);
    Filename为文件名(包括路径),参数Mode为打开文件的方式,它包括文件的打开模式和共享模式,其可能的取值和意义如下:

    打开模式:
    fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它。
    fmOpenRead :以只读方式打开指定文件
    fmOpenWrite :以只写方式打开指定文件
    fmOpenReadWrite:以写写方式打开指定文件
    共享模式:
    fmShareCompat :共享模式与FCBs兼容
    fmShareExclusive:不允许别的程序以任何方式打开该文件
    fmShareDenyWrite:不允许别的程序以写方式打开该文件
    fmShareDenyRead :不允许别的程序以读方式打开该文件
    fmShareDenyNone :别的程序可以以任何方式打开该文件

    TStream还有一个派生类TMemoryStream,实际应用中用的次数也非常频繁。它叫内存流,就是说在内存中建立一个流对象。它的基本方法和函数跟上面是一样的。


    写流:
    如果把文本框中的字符串写入流中,最好使用字符指针Pchar.例如:
    var
    pstr:Pchar;
    mestr:string;
    FS:TFilestream;
    begin
    FS:=TFileStream.Create((Extractfilepath(Application.ExeName)+'123.txt'),fmCreate );
    mestr:=edit1.text;
    pstr:=Pchar(mestr);//把字符串转成字符指针
    FS.Writebuffer(pstr^,Length(pstr));//把字符串写入流中


    读流
    流的读取比写入要困难一些,下面谈读流的几个注意点:
    1.如果是字符串的读取,最好也使用字符指针Pchar
    2.要给字符指针申请内存用GetMem
    3.要把字针转成字符型,直接付值就行
    4.要限定字符串长度,用SetLength,这条是很关键的
    5.要释放内存用FreeMem
    var
    pstr:Pchar;
    mestr:string;
    FS:TFilestream;
    meint:integer;
    begin
    FS:=TFileStream.Create((Extractfilepath(Application.ExeName)+'123.txt'),fmOpenRead );
    getmem(pstr,meint);//申请字符指针内存
    fs.Readbuffer(pstr^,meint);//在流里读出meint大小的字符串到字符指针
    mestr:=pstr;//字符指针转成字符
    SetLength(mestr,meint);//限定字符大小 
    freemem(Pstr);//释放内存
    FS.Free;//释放流
    end;
  • 相关阅读:
    Spring AOP @Before @Around @After 等 advice 的执行顺序
    web服务启动spring自动执行ApplicationListener的用法
    Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法
    ApplicationContextAware使用理解
    查询oracle比较慢的session和sql
    使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
    C#控制台程序中处理2个关闭事件的代码实例
    mysql优化----第一篇:综述
    HMM 隐马尔科夫模型
    EM 期望最大化算法
  • 原文地址:https://www.cnblogs.com/yclizq/p/13214163.html
Copyright © 2011-2022 走看看