zoukankan      html  css  js  c++  java
  • 结构化文件存取

    纲要:
    AssignFile: 关联
    Rewrite: 创建并打开一个新文件, 如已存在则覆盖
    Reset: 打开已存在的文件; 追加也要用它先打开, 然后再移动指针; Append 是文本文件专用的
    CloseFile: 关闭

    FileSize: 记录数
    FilePos: 返回文件的当前位置
    Seek: 把文件指针移到指定位置(只用于结构化文件)
    Eof: 文件尾

    Read: 读
    Write: 写

    另外: 包含长字符串、变量、类实例、接口或动态数组的记录不能写入类型文件中!

    //操作示例:
    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;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    type
      TPersonRec = packed record
        name: string[12];
        age: Word;
        birthday: TDate;
      end; //先定义一个结构
    
    var
      DataFile: file of TPersonRec;  //声明 DataFile 用来读写 TPersonRec 结构数据
      PersonRec: TPersonRec;  //声明结构变量
      FileName: string = 'c:\temp\test.dat';  //准备操作的文件
    
    
    //创建并写入文件
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      AssignFile(DataFile,FileName);  //关联文件
      Rewrite(DataFile);  //建立文件, 如果存在就覆盖
    
      PersonRec.name := '张三';
      PersonRec.age := 18;
      PersonRec.birthday := StrToDate('1990-1-1');
      Write(DataFile,PersonRec);  //写入
    
      PersonRec.name := '李四儿';
      PersonRec.age := 81;
      PersonRec.birthday := StrToDate('1927-11-11');
      Write(DataFile,PersonRec);  //写入
    
      CloseFile(DataFile);  //关闭
    end;
    
    
    //追加数据
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      AssignFile(DataFile,FileName);
      Reset(DataFile);  //Append 只对文本文件
      Seek(DataFile,FileSize(DataFile));  //移到文件尾, 这里的 FileSize 表示有多少条记录
    
      PersonRec.name := '王二麻子';
      PersonRec.age := 1;
      PersonRec.birthday := StrToDate('2006-12-19');
      Write(DataFile,PersonRec);
    
      PersonRec.name := '嫦娥';
      PersonRec.age := 2000;
      PersonRec.birthday := StrToDate('0007-7-7');
      Write(DataFile,PersonRec);
    
      CloseFile(DataFile);
    
    end;
    
    
    //读取数据(用Memo显示数据吧)
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      AssignFile(DataFile,FileName);
      Reset(DataFile);
    
      Memo1.Clear;
      Read(DataFile,PersonRec);  //读取一条, 指针自动移到下一条
      Memo1.Lines.Add(PersonRec.name);
      Memo1.Lines.Add(IntToStr(PersonRec.age));
      Memo1.Lines.Add(DateToStr(PersonRec.birthday));
    
      Read(DataFile,PersonRec);  //读取下一条
      Memo1.Lines.Add(PersonRec.name);
      Memo1.Lines.Add(IntToStr(PersonRec.age));
      Memo1.Lines.Add(DateToStr(PersonRec.birthday));
    
      Seek(DataFile,FileSize(DataFile)-1);  //指针移到最好一条
      Read(DataFile,PersonRec);
      Memo1.Lines.Add(PersonRec.name);
      Memo1.Lines.Add(IntToStr(PersonRec.age));
      Memo1.Lines.Add(DateToStr(PersonRec.birthday));
    
      CloseFile(DataFile);
    
    {显示结果:
      张三
      18
      1990-1-1
      李四儿
      81
      1927-11-11
      嫦娥
      2000
      0007-7-7
    }
    end;
    
    
    //修改数据
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      AssignFile(DataFile,FileName);
      Reset(DataFile);
    
      Seek(DataFile,3);  //指针移到第四条
      Read(DataFile,PersonRec);  //读取
      PersonRec.age := 0;
      PersonRec.birthday := StrToDate('2007-10-24');
    
      Seek(DataFile,3);  //指针移到第四条
      Write(DataFile,PersonRec);  //写入
    
      CloseFile(DataFile);
    end;
    
    
    //读取所有数据
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      AssignFile(DataFile,FileName);
      Reset(DataFile);
    
      Memo1.Clear;
      while not Eof(DataFile) do
      begin
        Memo1.Lines.Add('第 ' + IntToStr(FilePos(DataFile)+1) + ' 条:');
        Read(DataFile,PersonRec);
        Memo1.Lines.Add(PersonRec.name);
        Memo1.Lines.Add(IntToStr(PersonRec.age));
        Memo1.Lines.Add(DateToStr(PersonRec.birthday));
        Memo1.Lines.Add('');  //来个空行
      end;
    
      CloseFile(DataFile);
    
    {显示结果:
      第 1 条:
      张三
      18
      1990-1-1
    
      第 2 条:
      李四儿
      81
      1927-11-11
    
      第 3 条:
      王二麻子
      1
      2006-12-19
    
      第 4 条:
      嫦娥
      0
      2007-10-24
    }
    
    end;
    
    end.
    
  • 相关阅读:
    线程中断总结
    线程的基本协作和生产者消费者
    synchronized总结
    线程基础总结
    Java集合总结(三):堆与优先级队列
    Java集合总结(二):Map和Set
    Java集合总结(一):列表和队列
    java枚举类型总结
    java 内部类简单总结
    java Integer包装类装箱的一个细节
  • 原文地址:https://www.cnblogs.com/del/p/1005813.html
Copyright © 2011-2022 走看看