delphi在特定点将文本插入文本文件
我想编辑一个文本文件。如果我读了一行特殊的内容(比如说//--在这里开始编辑文本--//),那么在这行之后我想插入几行,但我不想覆盖现有的行。德尔福能做到这一点吗?谢谢 示例文本: 这 是一个文件 其中包含文本 //--开始在此处插入文本--// 两者之间没有任何差异delphi在特定点将文本插入文本文件,delphi,edit,text-files,Delphi,Edit,Text Files,我想编辑一个文本文件。如果我读了一行特殊的内容(比如说//--在这里开始编辑文本--//),那么在这行之后我想插入几行,但我不想覆盖现有的行。德尔福能做到这一点吗?谢谢 示例文本: 这 是一个文件 其中包含文本 //--开始在此处插入文本--// 两者之间没有任何差异 var SL: TStringList; InsTextPos: Integer; begin SL := TStringList.Create; try SL.LoadFromFile('c:\test.
var
SL: TStringList;
InsTextPos: Integer;
begin
SL := TStringList.Create;
try
SL.LoadFromFile('c:\test.txt');
InsTextPos := SL.IndexOf('//--begin inserting text here--//');
if InsTextPos >= 0 then
begin
SL.Insert(InsTextPos+1, 'Inserting Line 2');
SL.Insert(InsTextPos+1, 'Inserting Line 1');
SL.SaveToFile('c:\test.txt');
end;
finally
SL.Free;
end;
end;
编辑后的示例文本:
这
是一个文件
其中包含文本
//--开始在此处插入文本--//
现在有一些东西
介于两者之间
在这两者之间没有任何区别。有几种方法可以做到这一点
var
SL: TStringList;
InsTextPos: Integer;
begin
SL := TStringList.Create;
try
SL.LoadFromFile('c:\test.txt');
InsTextPos := SL.IndexOf('//--begin inserting text here--//');
if InsTextPos >= 0 then
begin
SL.Insert(InsTextPos+1, 'Inserting Line 2');
SL.Insert(InsTextPos+1, 'Inserting Line 1');
SL.SaveToFile('c:\test.txt');
end;
finally
SL.Free;
end;
end;
最简单的版本:
var
sl : TStringList;
I : Integer;
begin
sl := TStringList.Create;
sl.LoadFromFile();
// No you have an array of strings in memory one for each line
for I := 0 to SL.Count -1 do
begin
sl.strings[I];
end;
sl.SaveToFile();
end;
您还可以使用其他文件IO命令,例如:
要读取文本文件,请执行以下操作:
var
t : TextFile;
begin
AssignFile(t,'FileName.txt');
Reset(T);
while not eof(t);
begin
Readln(T,LineOfText);
end;
CloseFile(T);
end;
你可以写下你想要的东西
var
t : TextFile;
begin
AssignFile(t,'FileName.txt');
Rewrite(T);
Writeln(T,LineOfText);
Writeln(T,LineOfText);
Writeln(T,LineOfText);
CloseFile(T);
end;
应该注意的是,实际上上述两种方法都只是重写文件的全部内容
TFileStream
类允许您操作文件的实际字节。一般来说,你需要阅读,直到找到预期的文本。然后预读并缓存文件的其余部分,同时写出文件的新结尾。如何逐行迭代tstringlist?罗伯特的“indexof”语句看起来没问题,但我能逐行阅读吗?对于i:=0到SL.Count-1 do{这里用SL[i]}
在上两个示例中显示的旧文件IO方法(AssignFile
etc)已被弃用,这是为了向后兼容。(非常落后,它们从turbopascal/DOS时代就存在了。)您可能不应该推荐它们TFileStream
或其他流是Delphi中执行文件IO的“正常”方式。AssignFile可能很旧,但未弃用。我有Delphi XE,只是检查了系统单元和帮助文件,它没有以任何方式标记为已弃用。好的,它们没有标记为已弃用
关键字。它仍然不是现代Pascal中的惯用技术,而且有一个与WinAPI交互的非常好的类,它确实更好地提供了相同的功能。我想说的是,我认为这些API对于那些对Delphi不太了解的人来说是一个很糟糕的例子——如果你打算扩展TStringList,最好还是解释一下惯用(和现代)技术。