Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphi在特定点将文本插入文本文件_Delphi_Edit_Text Files - Fatal编程技术网

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,最好还是解释一下惯用(和现代)技术。