zoukankan      html  css  js  c++  java
  • delphi读写文本文件

    delphi读写文本文件
       在工作中遇到了这样一个问题,使用PLSQL将一个表的数据转化成一些列的insert语句存储到一个.sql文本中,我本来想使用access数据库中的查询视图一次执行这些语句,可是查询视图只能一次执行一条insert语句,如果手工执行将是一件很痛苦的事情。于是就自己想编写一个程序,让程序逐条读取insert语句,然后再执行语句。
    在网络上搜集了一些资料然后自己编写了一个逐行读取txt文本文件的程序,在这里和大家共享。
       procedure TForm1.Button1Click(Sender: TObject);
    var
    fi:TextFile; //system单元中有textfile数据类型的定义
    a1:string;
    i:integer;
    strsql:string;
    begin
    i:=1;
    strsql:='';
    AssignFile(fi,'e:22.txt');
    Reset(fi);
    while not Eof(fi) do
    begin
    Readln(fi,a1);
    strsql:=strsql+a1;
    if (i mod 2=0) then
    begin
    //showmessage(strsql);
    strsql:='';
    end;
    i:=i+1;
    end;
    CloseFile(fi);
    end;
    这里的关键是:while not eof(fi) do   ,在这个循环里可以逐条取得数据。
    Delphi 支持三种文件类型: 文本文件、记录文件、无类型文件。
    文本文件是以行为单位进行读、写的。由于每一行的长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写。
    文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。
    文本文件的打开需要两个步骤:1.文件变量与文件名关联;2.初始化读写。
    1.文件变量与文件名关联:
    AssignFile(VarTxt, FileName);
    FileName 如果省略路径将默认当前目录。
    2.初始化读写有三种方式:
    (1) Reset: 只读打开, 指针移到文件头;
    (2) Rewrite: 创建新文件并打开, 只写;
    (3) Append: 从尾部追加, 指针当然在文件尾。
    文件不存在时使用 Reset 或 Append 会引发一个I/O异常。
    最后用 CloseFile 关闭文件。
    为保持兼容,Delphi 也允许用户用 Assign 建立关联, 用 Close 关闭文件。
    --------------------------------------------------------------------------------

    //读写示例:
    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;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    private    { Private declarations }
    public    { Public declarations }
    end;

    var  Form1: TForm1;
    implementation
    {$R *.dfm}
    var
    F: Text;  //TextFile 和 Text 是一样的
    FileName: string = 'c: emp est.txt';
    //写文件
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    AssignFile(F,FileName);
    Rewrite(F);  //会覆盖已存在的文件
    Writeln(F, '第一行');
    Writeln(F, '第二行');
    CloseFile(F);
    end;
    //读文件(先执行写文件)
    procedure TForm1.Button2Click(Sender: TObject);
    var
    s: string;
    begin
    AssignFile(F,FileName);
    Reset(F);       //只读打开
    Readln(F, s);   //读取
    ShowMessage(s); //显示: 第一行
    Readln(F, s);   //继续读取
    ShowMessage(s); //显示: 第二行
    CloseFile(F);
    end;
    //追加
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    AssignFile(F,FileName);
    Append(F);  //打开准备追加
    Writeln(F, '第三行');
    Writeln(F, '第四行');
    CloseFile(F);
    end;
    //读取全部(需要Memo帮忙显示)
    procedure TForm1.Button4Click(Sender: TObject);
    var
    s: string;
    begin
    AssignFile(F,FileName);
    Reset(F);  //只读打开
    Memo1.Clear;
    while not Eof(F) do
    begin
    Readln(F, s);
    Memo1.Lines.Add(s);
    end;
    CloseFile(F);
    end;
    //分列写入
    procedure TForm1.Button5Click(Sender: TObject);  //这个过程级函数的功能是: 用空格把 s 凑够 n 的长度
    function AddSpace(s: string; n: Word): string;
    begin
    while Length(s) < n do
    begin
    s := s + ' ';
    end;
    Result := s;
    end;
    var
    name: string[8];
    address: string[16];
    begin
    AssignFile(F, FileName);
    Rewrite(F);
    name := '张三';
    name := AddSpace(name,8);
    address := '山东泰安';
    address := AddSpace(address,16);
    Writeln(F, name, address);
    name := '李四儿';
    name := AddSpace(name,8);
    address := '贵州省安顺黄果树';
    address := AddSpace(address,16);
    Writeln(F, name, address);
    name := '王二麻子';
    name := AddSpace(name,8);
    address := AddSpace(address,16);
    Writeln(F, name, address);
      CloseFile(F);
    {写入的结果是:  张三    山东泰安  李四儿  贵州省安顺黄果树  王二麻子北京市海淀区}
    end;
    //分列读取
    procedure TForm1.Button6Click(Sender: TObject);
    var  name: string[8];
    address: string[16];
    begin
    AssignFile(F, FileName);
    Reset(F);
    Memo1.Clear;
    while not Eof(F) do
    begin
    Readln(F, name);
    Memo1.Lines.Add(name);
    end;
    CloseFile(F);
    Reset(F);
    while not Eof(F) do
    begin
    Readln(F, name, address);
    Memo1.Lines.Add(address);
    end;
    CloseFile(F);
    {读取结果:  张三      李四儿    王二麻子  山东泰安          贵州省安顺黄果树  北京市海淀区    }
    end;
    //不同数据类型的写入和读取
    procedure TForm1.Button7Click(Sender: TObject);
    var  name: string[6];
    age: Word;
    birthday: TDate;
    begin
    AssignFile(F,FileName);
    Rewrite(F);
    name := '菜花  ';  //加两个空格凑够6个字符
    age := 18;
    birthday := StrToDate(DateToStr(Now-18*365));  //假如她今天过生日
    Writeln(F,name,age,birthday);
    CloseFile(F);
    Reset(F);
    Readln(F,name,age,birthday);
    Memo1.Clear;
    Memo1.Lines.Add(name);
    Memo1.Lines.Add(IntToStr(age));
    Memo1.Lines.Add(DateToStr(birthday));
    CloseFile(F);
    {读取结果:  菜花  18  1989-12-23}
    //其实这样的东西应该用类型文件操作更合适, 但如果有这样的文本文件让你读取呢?
    end;
    end.

  • 相关阅读:
    SpringBoot Schedule 配置
    ElasticSearch与Spring Boot集成问题
    Mybaits使用
    Java生成随机验证码
    Netty-FastThreadLocal快在哪里呢?
    直方图反向投影学习-----个人理解(你究竟是不是凶手)
    zookeeper启动报 Unexpected exception, exiting abnormally 错误
    upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件
    request.getRealPath为什么会被代替
    Java2E中的路径问题
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/3313258.html
Copyright © 2011-2022 走看看