[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]

    {
    JAN DOGGEN

    > I have already written the parts that open and read the File and find the
    > Record I need to update.  Now I want to replace part of the String of
    > Characters which comprise this Record, With the Record remaining in its
    > location in the File.

    No, if you use a Text File (Var T: Text) it's either read or Write.

     1. if you only replace 'n' Characters With another 'n' Characters, it
     is no big problem, although hardly an elegant solution:
     you can Type it as a File of Byte, then read /Write each String
     using something like:
    }

    Procedure BlockWriteStr(Var F : File; S : String);
    Var
      L, Written : Word;
    begin
      L := Length(S) + 1;
      BlockWrite(File(F), S[0], L, Written);
      Assert(L = Written, 'Error writing to disk (disk full ?)');
    end;

    Procedure BlockReadStr(Var F : File; Var S : String);
    Var
      ReadIn : Word;
    begin
      BlockRead(File(F), S[0], SizeOf(Byte));
      BlockRead(File(F), S[1], Ord(S[0]), ReadIn);
      Assert(Ord(S[0]) = ReadIn, 'Error reading from disk');
    end;

    { Of course, you'll have to remember your FilePos().

     2. if you replace With a different number of Chars, I cannot help
     you, other than suggesting you use an input and output Text File,
     and reWrite the whole thing. Not very elegant either.

     BTW, as I am still in my editor, I might as well copy this too:
    }

    Function SubstituteStr(Original, Part1, Part2 : String): String;
    (* Replaces all <Part1> subStrings in String <Original> With <Part2>.
     *
     * Example:
     *   SubstituteStr('Abracadabra','ra','rom') ==> 'Abromcadabrom'
     * The Function does not work recursively, so:
     *   SubstituteStr('Daaaaaaaar','aa','a') returns 'Daaaar', not 'Dar'.*)
    Var
      S       : String;
      P, L, T : Byte;
    begin
      if Original = '' then
      begin
        SubstituteStr := '';
        Exit;
      end;

      S := '';
      L := Length(Part1);
      T := 1;
      P := Pos(Part1,Copy(Original,T,255));

      While P <> 0 DO
      begin
        S := S + Copy(Original, T, P - 1) + Part2;
        T := T + P + L - 1;
        P := Pos(Part1, Copy(Original, T, 255));
      end;
      SubstituteStr := S + Copy(Original, T, 255);
    end;

    Function SubstituteStrX(Original, Part1, Part2 : String) : String;
    (* Like SubstituteStr, but now the Function works recursively, so
    *   SubstituteStrX('Daaaaaaaar','aa','a') returns 'Dar'. *)
    Var
      S       : String;
      P, L, T : Byte;
    begin
      if Original = '' then
      begin
        SubstituteStrX := '';
        Exit;
      end;

      S := Original;
      T := 1;
      L := Length(Part1);
      P := Pos(Part1,S);

      While P <> 0 DO
      begin
        S := Copy(S, 1, P - 1) + Part2 + Copy(S, P + L, 255);
        P := Pos(Part1, S);
      end;
      SubstituteStrX := S;
    end;

[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]