Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   EOF beendet das Einlesen einer Datei vorzeitig (https://www.delphipraxis.net/184380-eof-beendet-das-einlesen-einer-datei-vorzeitig.html)

dGeek 21. Mär 2015 00:06

EOF beendet das Einlesen einer Datei vorzeitig
 
Ich habe eine sehr große Textdatei, welche mehrfach ein EOF, also enthält.

Ein Einlesen per Stream oder TStringList ist also nicht möglich.

Wie kann ich diese Datei konvertieren bzw alle unnötigen EOF entfernen?

Sir Rufo 21. Mär 2015 00:09

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Wieso sollte da kein Stream gehen? Mit einem
Delphi-Quellcode:
TFileStream
kannst du die gesamte Datei rauf und runter ackern ... wie du lustig bist

dGeek 21. Mär 2015 00:13

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Habe das schon alles durch.

In Notepad++ wird mir das verdächtige Zeichen als NUL angezeigt, es kann aber nur ein #26, also EOF sein.
Denn selbst ein Stream hört dort auf zu lesen.

Edit:
was ich noch dazu sagen sollte ist, dass die Datei kein BOM hat!

Sir Rufo 21. Mär 2015 00:19

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Dann hast du da eine Zauberdatei, die eine Aversion gegen Delphi hat :roll:

Ein
Delphi-Quellcode:
TFileStream
kann die Datei rauf und runter lesen und zwar jedes einzelne Byte (und ich sage Byte und nicht String)

dGeek 21. Mär 2015 00:21

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Ich kann die Datei extrem gekürzt mit genau diesem Zeichen mal hier rein stellen wenn du möchtest.

dGeek 21. Mär 2015 00:26

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Liste der Anhänge anzeigen (Anzahl: 1)
Datei mit seltsamen Zeichen in Zeile 4. Mit Notepad++ öffnen oder in Delphi einlesen.
Siehe Anhang.

Delphi-Quellcode:
sl := TStringList.Create;
    try
      sl.LoadFromFile(aFile);
      showmessage(IntToStr(sl.Count - 1));
      for i := 0 to sl.Count - 1 do
      begin
        showmessage(sl.Strings[i]);
      end;
    finally
      sl.Free;
    end;

Sir Rufo 21. Mär 2015 00:32

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von dGeek (Beitrag 1294295)
Ich kann die Datei extrem gekürzt mit genau diesem Zeichen mal hier rein stellen wenn du möchtest.

Danke, soweit bin ich schon, dass ich mir eine Datei erzeugen kann, wo ein Byte 00 ist. Aber du solltest dir die Datei mal mit einem Hex-Editor anschauen.

Wenn du keinen Hex-Editor hast, dann kannst du dir ganz schnell selber einen bauen. Mit
Delphi-Quellcode:
TFileStream
die Datei öffnen und jedes Byte in Hex-Darstellung anzeigen lassen.

Dalai 21. Mär 2015 00:33

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von dGeek (Beitrag 1294293)
In Notepad++ wird mir das verdächtige Zeichen als NUL angezeigt [...]

Und dann kommst du in #6 mit TStringList? Das kann nix werden. Aber mit Streams wird das sicher funktionieren; wie genau weiß ich mangels Erfahrung damit aber nicht zu sagen.

MfG Dalai

dGeek 21. Mär 2015 00:35

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Ok 00 sehe ich. Dann ist es doch nicht wie vermutet ein #26.

Was bedeutet dieses 00 denn nun? EOF ja wohl nicht, nehme ich an.

Edit: Frage hat sich gerade geklärt.

Sir Rufo 21. Mär 2015 00:42

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von dGeek (Beitrag 1294300)
Ok 00 sehe ich. Dann ist es doch nicht wie vermutet ein #26.

Was bedeutet dieses 00 denn nun? EOF ja wohl nicht, nehme ich an.

Es kann alles bedeuten: Angriff der Killerbienen, Invasion vom Mars, 42-42, wieviel Lust ich heute zum Aufräumen habe, ...

Die wirkliche Bedeutung kommt erst durch den Kontext. Einfach nur 0 sagt nur 0 aus

himitsu 21. Mär 2015 08:34

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
TStrings/TStringList hält sich an die Speicherbedingungen für PChar (0-terminitere Strings aus WinAPI/C++).

Eine "normale" Textdatei enthält eigentlich keine #0, aber ob und wie ein(e) Programm/Komponente die "Daten" in einer Datei interpretiert kann unterschiedlich sein.
TStrings/TStringList reagiert "standardmäßig" nunmal auf gewisse Zeichen, wie eben #0, #10 und #13, denn es verhält sie wie TMemo, dessen interne Windows-Komponente nunmal mit PChar arbeitet.

Mavarik 22. Mär 2015 23:29

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von Sir Rufo (Beitrag 1294302)
Es kann alles bedeuten: Angriff der Killerbienen, Invasion vom Mars, 42-42, wieviel Lust ich heute zum Aufräumen habe, ...

Die wirkliche Bedeutung kommt erst durch den Kontext. Einfach nur 0 sagt nur 0 aus

Nein das kann man so nicht stehen lassen... Da Du mit einer Null nur maximal einen Zustand beschreiben kannst, must Du dich bei der Interpretation auch auf maximal
einen Zustand festlegen...

Ich bin ja für die Killerbienen...

Sir Rufo 22. Mär 2015 23:59

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von Mavarik (Beitrag 1294440)
Zitat:

Zitat von Sir Rufo (Beitrag 1294302)
Es kann alles bedeuten: Angriff der Killerbienen, Invasion vom Mars, 42-42, wieviel Lust ich heute zum Aufräumen habe, ...

Die wirkliche Bedeutung kommt erst durch den Kontext. Einfach nur 0 sagt nur 0 aus

Nein das kann man so nicht stehen lassen... Da Du mit einer Null nur maximal einen Zustand beschreiben kannst, must Du dich bei der Interpretation auch auf maximal
einen Zustand festlegen...

Ich bin ja für die Killerbienen...

Ja 0 beschreibt nur einen Zustand innerhalb eines Kontexts. Da aber der Kontext unbekannt ist wo dieser Zustand definiert ist kann es sich eben um jeden beliebigen Kontext und somit um jeden beliebigen Zustand handeln.

Grayknife 24. Mär 2015 14:41

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Nochmal eine andere sachen, wollte keinen neuen Thread dafür erstellen :)

Immer lese ich, wenn man irgendwas extern lädt, oder auch intern:

Delphi-Quellcode:
 Bild1:=TBitmap.Create;    //Bild1 wird erstellt.
 Try
 Bild1.LoadfromFile(ExtractFilepath(ParamStr(0)) + 'Items\Bild1.bmp'); //Bild1 wird geladen.
 Finally
 Bild1.Free;
 End;
-> Warum denn diese Try Finally Schleife, und warum muss man das Bild am Ende wieder freigeben?

-> Als ich heute mein Programm öffnen wollte, hat mir Delphi gesagt: RLINK32: Out of memory! Hat/Kann das was damit zu tun haben, dass ich Bilder nicht freigebe?
-> Als ich gestern gesehen habe, das man Icons dem Programm hinzufügen kann, habe ich das gleich gemacht, jeder Form über dem Objektinspektor. Später habe ich gesehen, das man über Projekt->Optionen->Anwendung->Symbol->Symbol laden , das ebenfalls machen kann, und sicherheitshalber auch nochmal da das Symbol hinzugefügt habe. Aber ich glaube das war nicht so gut :pale::pale:
Denn es kommt auch der Fehler: Doppelte Ressource (...,...)
-> Man muss doch sicher alles freigeben, auch Textfiles und und und, oder?

DeddyH 24. Mär 2015 14:43

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von Grayknife (Beitrag 1294643)
Nochmal eine andere sachen, wollte keinen neuen Thread dafür erstellen :)

Das solltest Du aber, denn die Frage hat ja mit dem Thread-Thema nichts mehr zu tun.

Mavarik 24. Mär 2015 14:52

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von dGeek (Beitrag 1294296)
Datei mit seltsamen Zeichen

Dann mach doch einfach so etwas:
Ausnahmsweise per Stream und nicht wie sonst per Blockread/Write :stupid:

Delphi-Quellcode:
  Procedure CorrectFile(F:String);
  var
    MS : TMemoryStream;
    I : Integer;
    P : PByte;
  begin
    MS := TMemoryStream.Create;
    try
      MS.LoadFromFile(F); // geändert

      MS.Position := 0;
      P := MS.Memory;
 
      For i:=0 to MS.Size-1 do
        begin
          if P^ = $1A then // Dateiende
            P^ := $20;
          inc(p);
        end;

      MS.SaveToFile(F); // geändert
    finally
      MS.Free;
    end;
  end;
oder halt klassisch

Delphi-Quellcode:
  Procedure CorrectFile(F:String);
  var
    FD     : File;
    Buffer : Array of byte;
    Size,I : Integer;
  begin
    AssignFile(FD,F);
    Reset(FD,1);
    try
      Size := FileSize(FD);

      Setlength(Buffer,Size);
      Blockread(fd,Buffer[0],Size);
      Seek(FD,0);

      For i:=0 to Size-1 do
        if Buffer[i] = $1A then
          Buffer[i] := $20;

      Blockwrite(FD,Buffer[0],Size);
    finally
      Closefile(FD);
    end;
  end;

Mavarik

DeddyH 24. Mär 2015 14:56

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Ein paar Ressourcenschutzblöcke wären nicht schlecht, und kann man sich die erste FileStream-Instanz nicht sparen und stattdessen LoadFromFile des MemoryStream nehmen, oder überseh ich da etwas?

Mavarik 24. Mär 2015 15:02

AW: EOF beendet das Einlesen einer Datei vorzeitig
 
Zitat:

Zitat von DeddyH (Beitrag 1294646)
Ein paar Ressourcenschutzblöcke wären nicht schlecht, und kann man sich die erste FileStream-Instanz nicht sparen und stattdessen LoadFromFile des MemoryStream nehmen, oder überseh ich da etwas?

Stimmt... War bei mir ein compressed Stream... daher... Copy Buffer...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr.

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