Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zeilenumbruch ersetzen Algorithmus

  Alt 11. Mär 2018, 16:20
Delphi-Quellcode:
procedure TIrgendeineKlasse.Zeichenaustauschen(input : TMemoryStream; output : TMemoryStream);
Var
  ch1 : Char;
  ch2 : Char;
begin
  input.Position := 0;
  output.Position := 0;
  // Ist überhaupt was in der Datei drin?
  if input.Read(ch1, 1) > 0 then begin
    repeat
      case ch of
        #13 : begin // Das nächste Zeichen lesen.
                if input.Read(ch2, 1) <> 0 then begin
                  case ch2 of
                    #10 : ; // ignorieren, wird als nächstes Zeichen gelesen.
                  else
                    begin // wenn wir 'ne #13 erhalten und keine #10 folgt, geben wir 'ne #10 aus.
                      ch2 := #10;
                      output.Write(ch2,1);
                    end;
                  end;
                  // und wieder ein Zeichen zurück.
                  input.Position := input.Position - 1;
                end;
              end;
      else
        output.Write(ch1,1); // Übrige Zeichen ausgeben.
      end;
    until input.Read(ch1, 1) = 0;
    input.Position := 0;
    output.Position := 0;
  end;
end;
Der Code hat immer noch ein paar Probleme (unter der Annahme, daß hier mindestens das im Profil angegeben Delphi 2010 zum Einsatz kommt):

1. Auf der einen Seite werden ch1 und ch2 als Char (2 Bytes) deklariert, mit Read wird aber nur jeweils 1 Byte eingelesen. Damit ist das höhere Byte undefiniert und das case könnte daneben gehen. Da wir ja hier alle wohl von eine ANSI- bzw. UTF8-codierten Textdatei ausgehen, würde ich direkt mit Byte (oder AnsiChar) arbeiten.

2. Der Code unterschlägt das letzte Zeilenende, wenn dieses durch ein einzelnes #13 gekennzeichnet ist.

3. Eine Unicode-Datei könnte man damit nicht direkt umsetzen, da der komplette Bereich 0D00-0DFF sowie alle Zeichen mit 0D im Low-Byte falsch behandelt werden. Ich vermute aber, daß dies hier nicht relevant sein wird (siehe 1).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat