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:\temp\test.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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM