delphi 写入到txt的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 写入到txt的问题相关的知识,希望对你有一定的参考价值。
我现在用delphi 写个程序,需要将 Memo1.Lines里面的字符串存到一个文本文档里,如:memo1.lines.savetofile('test.txt'); 但是这样会有个问题,就是我在memo中写入一个字符串('AAA'),再次运行程序,写入('BBB'),test.txt文本中就只有BBB了,也就是savetofile不是将文本写入文件,而是保存字符串再替换test.txt文件,现在我不想替换文件,想要的结果是('AAABBB');
各位帮帮忙。
Var
F : Textfile;
Begin
if fileExists(FileName) then DeleteFile(FileName); 看文件是否存在,在就删除
AssignFile(F, FileName); 将文件名与变量 F 关联
ReWrite(F); 创建一个新的文件并命名为 ek.txt
Writeln(F, '将您要写入的文本写入到一个 .txt 文件');
Closefile(F); 关闭文件 F
End;
Procedure OpenTxt(FileName:String);
Var
F : Textfile;
Begin
AssignFile(F,FileName); 将文件名与变量 F 关联
Append(F); 以编辑方式打开文件 F
Writeln(F, '将您要写入的文本写入到一个 .txt 文件');
Closefile(F); 关闭文件 F
End;
Procedure ReadTxt(FileName:String);
Var
F : Textfile;
str : String;
Begin
AssignFile(F, FileName); 将文件名与变量 F 关联
Reset(F); 打开并读取文件 F
Readln(F, str);
ShowMessage('文件有:' +str + '行。');
Closefile(F); 关闭文件 F
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
NewTxt;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenTxt;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ReadTxt;
end;
------------------------------------------------------------------
Procedure AppendTxt(Str:String;FileName:String);
Var
F:Textfile;
Begin
AssignFile(F, FileName);
Append(F);
Writeln(F, Str);
Closefile(F);
End; 参考技术A 你这种方法是在覆盖文件
你想要的是续写文件
试试:
先打开文件
再把文件指针移到文件尾
再把memo.lines中的文本写入文件中
关闭文件 参考技术B //楼上'陶白白'正解, 但是程序不全面, 我来补全
//Delphi 2009 编译通过
procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
begin
List := TStringList.Create; //创建List
if FileExists('C:\123.txt') then //比如是C:\123.txt
List.LoadFromFile('C:\123.txt'); //数据读入到List
List.AddStrings(Memo1.Lines); //追加Memo文本到List
List.SaveToFile('C:\123.txt'); //保存
List.Free; //释放
end; 参考技术C procedure TForm1.btn_SaveClick(Sender: TObject);
var sl:TStringList;
begin
sl := TStringList.Create;
sl.LoadFromFile('123.txt');
sl.AddStrings(mmo1.Lines);
sl.SaveToFile('123.txt');
sl.Free;
end;
delphi stringgrid里的数据到本地txt文件的读取和写入的代码
帮我写一下stringgrid里的数据到本地txt文件的读取和写入的代码。
我现在是用list做的,但是运行过程中会提示“另一个程序在在使用此文件,进程无法访问”
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
在线等。弄好的话再奖500积分
procedure SaveS(S:string);
var slst:tstringlist;
begin
slst:=tstringlist.create();
slst.Text:=s;
slst.savetofile('c:\aaa.txt');
freeandnil(slst);
end;
读:
第一种、直接用 memo 加载 txt文件
1. memo控件读取txt
memo1.Lines.LoadFromFile('E:\*\*.txt');
要读取一个txt文件的全部内容可以借用到 stringlist 来中转。
建立一个stringlist,如:
var
sList: TStringlist;
begin
sList := TStringList.Create;
try
sList.LoadFromFile('C:\a.txt');
finally
sList.Free;
end;
end;
然后可以将TStringList 转换为 string类型 str=ts.GetText ; 来转换
第二种、Delph内建的函数读写
示例代码:
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;
第三种、Delphi 用流来读取TXT文件
TXT文本文件是一种以ACSII吗存储数据的文件。在TXT文件中只能够存储一些字符数据,所以这种文件的移植性和通用性很强,具有较高的易用性,并且 被广泛应用,所以Delphi对该类型文件提供了较好的支持。目前在Internet上最为流行的XML文件也是一种文本文件。TXT文本文件的操作非常 简单,具体操作过程如下:
1.首先要声明一个TextFile类型的的文件指针。如:var MyFile:TEXTFile。
2.然后使用AssignFile方法将声明的文件指针与外部TXT文件相关联。AssignFile (FileName ) ;FileName 既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。
3.初始化读写有三种方式: Reset为读打开文件并把文件指针移动到文件首;Rewrite为写创建一个新文件;Append为写打开存在的文件并把文件指针定位在文件尾。
4.读取或写入文本。Readln方法能够读取一行文本,writeln方法能向文件写入一行文本。
5.最后用Closefile方法关闭已打开的文件。
以上 ,希望能对您有帮助 参考技术A 首先说代码本身没有问题。
问题出在调用SaveGrid函数时,给定的参数filename所指定的文件读写权限本身未进行检查。造成无法写入已打开的文件。
解决方法:
以下有两种解决方法,各有优缺点
方法一:
在调用SaveGrid时,每次给出一个唯一的文件名称。这个文件名可以用当前时间作为文件名字。
这种方法运行时间长或次数多了后,会产生较多的文件。
代码如下:
var
FileName:String;
begin
FileName:=ExtractFilePath(Application.ExeName)+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');//保存路径为本Exe程序所在的目录
SaveGrid(StringGrid1,FileName);
end;
方法二:
在调用函数前判断文件是否可以读写。如果权限不够提示用户
判断的话因为要写入新文件,可以尝试是否可以删除旧文件来进行判断
代码如下
var
Filaname:String;
begin
FileName:='c:\d.txt';
if FileExists(FileName) then
begin
Try
DeleteFile(FileName);
except
Application('文件已打开,或被其它软件锁定','权限不足',mb_OK);
end;
end;
SaveGrid(StringGrid1,FileName);
end; 参考技术B 提示“另一个程序在在使用此文件,进程无法访问”,表示你多次执行文件还在占用或者文件已经被打开;
尝试更改filename,再重新运行看看;
代码:
procedure TForm1.Button1Click(Sender: TObject);
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
end;
begin
SaveGrid(StringGrid1,'d:\'+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');
end;本回答被提问者和网友采纳 参考技术C 写入: procedure TForm1.Button1Click(Sender: TObject);
procedure SaveGrid(g:TStringGrid; filename:string); //定义 导出grid表的过程
var i:integer; t:TStringlist;
begin
t:=TStringlist.Create;//list创建
for i:=0 to g.RowCount-1 do
begin
g.Rows[i].Delimiter:='|';
t.Add(g.Rows[i].DelimitedText);//list增加
end;
t.SaveToFile(filename);
t.Clear;//list清空
t.Free;//list释放
end;
begin
SaveGrid(StringGrid1,'d:\'+FormatDateTime('yyyymmdd_hhmmss',Now)+'.txt');
end;
读取:
procedure TForm1.Button1Click(Sender: TObject);
var
aa,bb:tstringlist;
i:integer;
begin
aa:=tstringlist.Create;
bb:=tstringlist.Create;
aa.LoadFromFile('c:.txt');
for i:=0 to aa.Count-1 do
begin
bb:=SplitString(aa.Strings[i],' ');
stringgrid1.Rows[i]:=bb;
end;
aa.Free;
bb.Free;
end;
其中splitstring为:
function SplitString(const source,ch:string):tstringlist;
var
temp:string;
i:integer;
begin
result:=tstringlist.Create;
temp:=source;
i:=pos(ch,source);
while i<>0 do
begin
result.Add(copy(temp,0,i-1));
delete(temp,1,i);
i:=pos(ch,temp);
end;
result.Add(temp);
end; 参考技术D
// Save a TStringGrid to a file
procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
i, k: Integer;
begin
AssignFile(f, FileName);
Rewrite(f);
with StringGrid do
begin
// Write number of Columns/Rows
Writeln(f, ColCount);
Writeln(f, RowCount);
// loop through cells
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
Writeln(F, Cells[i, k]);
end;
CloseFile(F);
end;
// Load a TStringGrid from a file
procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);
var
f: TextFile;
iTmp, i, k: Integer;
strTemp: String;
begin
AssignFile(f, FileName);
Reset(f);
with StringGrid do
begin
// Get number of columns
Readln(f, iTmp);
ColCount := iTmp;
// Get number of rows
Readln(f, iTmp);
RowCount := iTmp;
// loop through cells & fill in values
for i := 0 to ColCount - 1 do
for k := 0 to RowCount - 1 do
begin
Readln(f, strTemp);
Cells[i, k] := strTemp;
end;
end;
CloseFile(f);
end;
// Save StringGrid1 to 'c:\\temp.txt':
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveStringGrid(StringGrid1, 'c:\\temp.txt');
end;
// Load StringGrid1 from 'c:\\temp.txt':
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadStringGrid(StringGrid1, 'c:\\temp.txt');
end;
以上是关于delphi 写入到txt的问题的主要内容,如果未能解决你的问题,请参考以下文章