Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit #0 in einer Text-Datei beim Laden (https://www.delphipraxis.net/132695-problem-mit-0-einer-text-datei-beim-laden.html)

Helmi 17. Apr 2009 18:46


Problem mit #0 in einer Text-Datei beim Laden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe Datei, die leider in den ersten Zeilen vermutlich das Zeichen #0 drin hat.
Ich hab den Kopf der Datei mal angehängt.

Wenn ich diese Datei nun in ein Memo, z. B. laden möchte, dann bekomm ich nur die
ersten Zeichen - ganz klar, weil ja Strings in Delphi null terminierend sind.

Nur wie kann ich ich nun diese Datei trotzdem laden?
Was muss ich zuvor per Code tun um diese Datei in ein memo z. b. zu laden?

oki 17. Apr 2009 19:02

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Hi,

Memos mögen definitiv keine #0. Lade die Datei in einen Stream, entferne alle #0, und übergieb das dann dem Memo.

Gruß oki

Helmi 17. Apr 2009 19:04

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Zitat:

Zitat von oki
Memos mögen definitiv keine #0. Lade die Datei in einen Stream, entferne alle #0, und übergieb das dann dem Memo.

mmmh - ich will ja jetzt ned aufdringlich wirken, aber wie kann ich in einem Stream die #0 löschen?

FabianClassen 17. Apr 2009 19:10

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Kann man da nicht irgendwie Trim() nutzen?

MFG
FC
;)

jaenicke 17. Apr 2009 19:17

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Nimm nen TStringStream, hol dir den Inhalt aus DataString in eine Stringvariable, gehe zeichenweise durch und ersetze #0 durch #32.

@FabianClassen:
Nein, Trim entfernt nur Leerzeichen und Steuerzeichen von Anfang und Ende eines Strings.

nahpets 17. Apr 2009 19:23

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Hallo,
Zitat:

Zitat von Helmi
Zitat:

Zitat von oki
Memos mögen definitiv keine #0. Lade die Datei in einen Stream, entferne alle #0, und übergieb das dann dem Memo.

mmmh - ich will ja jetzt ned aufdringlich wirken, aber wie kann ich in einem Stream die #0 löschen?

schlimmstenfalls musst Du den Stream byteweise durchgehen und per Case auf #0 abfragen und in dem Fall dann z. B. durch #32 ersetzen. Sprich, eine Forschleife könnte da schon ausreichen.

Helmi 17. Apr 2009 20:54

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Hallo,

ich hab das jetzt mal versucht hinzuzaubern, nur leider werden mir trotzdem nur die ersten Zeichen gezeigt.

Hier mal mein Code.
Den Gedanken von nahpets hab ich aufgefasst, und versucht umzusetzen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  Datei = 'd:\nc_upgrd.txt';

var
  MemoryStream: TMemoryStream;

  Position: Integer;
  S: String;
  Buffer: Char;

begin
  MemoryStream := TMemoryStream.Create;

  MemoryStream.LoadFromFile(Datei);
  MemoryStream.Position := 0;

  try
    while MemoryStream.Position < MemoryStream.Size do
      begin
        Position := MemoryStream.Read(Buffer, 1);

        If Buffer = #0 then
          begin
            Buffer := #32;

            MemoryStream.WriteBuffer(Buffer, 1);
          end;

        MemoryStream.Position := MemoryStream.Position + Position;
      end;

  MemoryStream.Position := 0;

    ListBox1.Items.LoadFromStream(MemoryStream);
  finally
    FreeAndNil(MemoryStream);
  end;
end;
Die Version mittels Stringstream und for-Schleife hat nicht funktioniert.

oki 17. Apr 2009 21:12

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Hi,

einlesen wie jaenicke beschrieben hat. Alle #0 ersetzen mittels:
Delphi-Quellcode:
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
Für OldPattern #0 und für NewPattern '' oder #32 für Leerzeichen angeben. Flags: rfReplaceAll

Gruß oki

oki 17. Apr 2009 21:25

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Ich denke, so sollte es klappen. Code ungeprüft, Rest selber machen:
Delphi-Quellcode:
procedure ReadText(AFileName : String);
var FStream : TFileStream;
    SStream : TStringStream;
    s : String;
begin
  s := '';
  FStream := TFileStream.Create(AFileName);
  SStream := TStringStream.Create(s);
  try
    FStream.Position := 0;
    SStream.CopyFrom(FStream, FStream.Size);
    SStream.Position := 0;
    s := SStream.ReadString(SStream.Size);
    s := StringReplace(s, #0, '', rfReplaceAll);
    Memo1.Text := s;
  finally
    FreeAndNil(FStream);
    FreeAndNil(SStream);
  end;
end;
Gruß oki

Helmi 18. Apr 2009 08:16

Re: Problem mit #0 in einer Text-Datei beim Laden
 
Hallo oki,

danke für den Code! - Irgendwie stand ich auf dem Schlauch.

Ich hab jetzt deinen Code genommen, getestet und umgebaut:

Delphi-Quellcode:
function ReadText(AFileName : String): String;
var
  FStream: TFileStream;
  SStream: TStringStream;
  S: String;
  i: Integer;

begin
  S := '';

  If not FileExists(AFileName) then
    exit;

  FStream := TFileStream.Create(AFileName, fmOpenRead);
  SStream := TStringStream.Create(S);

  try
    FStream.Position := 0;
    SStream.CopyFrom(FStream, FStream.Size);
    SStream.Position := 0;
    S := SStream.ReadString(SStream.Size);
//    S := StringReplace(S, #0, #32, [rfReplaceAll]);

    for i := 1 to length(S) do
      If S[i] = #0 then
        S[i] := #13;

    Result := S;
  finally
    FreeAndNil(FStream);
    FreeAndNil(SStream);
  end;
end;
StringReplace hat leider nicht funktioniert. Nach StringReplace waren die #0 trotzdem
noch vorhanden.
Die for-Schleife funktioniert und ersetzt die #0 durch #13 (Zeilenumbruch)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz