Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei mit "#0" schreiben? (https://www.delphipraxis.net/89594-datei-mit-0-schreiben.html)

grizzly 3. Apr 2007 10:34

Re: Datei mit "#0" schreiben?
 
Bei meinem UnitUsage Projekt bin ich auch mal über Text-Dateien gestolpert, welche ein #0 beinhalteten (stand tatsächlich mal in einem Kommentar in einem Pascal-Sourcecode). Ärgerlich war, daß die TStringList beim Einlesen bei dem #0 aufgehört hat. Als ob Pascal C wäre!
Da ich sowieso eine Klasse von TStringList ableiten mußte, habe ich deshalb gleich deren Routine LoadFromStream(..) ersetzt. Diese Routine rief eine andere namens SetTextStr(..) auf, welche auf #0 prüfte. Den Teil hab' ich geändert (Minimaler Eingriff in den Original Code), danach hat die abgeleitete stringlist brav bis zum Ende gelesen. Vielleicht reicht ja so ein Eingriff bei Deinem Problem auch - zumindest für's Lesen?
(Siehe Source von UnitUsage, Datei DelDirective.pas)
Ansonsten hat ja TStringList mit #0 keine Probleme - Beim Schreiben wird's halt wieder klemmen ;)

Gruß
Michael

xZise 3. Apr 2007 10:38

Re: Datei mit "#0" schreiben?
 
Und genau mit dem schreiben hab ich das Problem ^^ Weil solange ich nirgens eine Datei mit #0 schreiben kann, kann ich auch nicht testen, ob er auch richtig liest (obwohl bisher es brav aussieht ^^)

3_of_8 3. Apr 2007 11:41

Re: Datei mit "#0" schreiben?
 
Pointer(#0)^? Ein Pointer auf ein Literal? Aua.

Delphi-Quellcode:
var fs: TFileStream;
    buf: Char;
begin
  //...
  fs.Write(buf, 1);
  //...
end;

grizzly 3. Apr 2007 11:49

Re: Datei mit "#0" schreiben?
 
[Editiert, um den größten Krampf meiner letzten Antwort loszuwerden. Hab' irgendwie das Thema verfehlt... :oops: ]

TStringList schreibt zumindest den Null Charakter brav raus (SaveToFile, welches intern einen TFileStream verwendet), lediglich das ReadFromFile fängt unnötigerweise mit dem Interpretieren an. Mit TStringList sollte es also wenig Probleme geben, solche Dateien zu erzeugen (Delphi 6).
Allerdings wird #0 als Zeilenumbruch interpretiert (Siehe z.B. Classes.pas procedure TStrings.SetTextStr(..); Das könnte einem beim Arbeiten mit der StringListe dann doch mal was verhageln...

Gruß
Michael

bigg 3. Apr 2007 12:12

Re: Datei mit "#0" schreiben?
 
@xZise: Leg ein Array of Byte an, das die Länge der Dateigröße besitzt. Anschließend liest du die Datei über FileOpen(), FileRead() in dein Array ein. Mit einer For-Schleife durchsuchst du nun Zeichen für Zeichen dein Array of Byte und kopierst dir die Segmente heraus die du benötigt. (zum Bleistift mit Copy() sofern es sich um ANSI-Dateien handelt) Den Dateiaufbau sollte man möglichst genau kennen... Abschließend noch ein FileClose ausführen. Fertig.

matashen 3. Apr 2007 12:27

Re: Datei mit "#0" schreiben?
 
Hallo,

warum nicht nach dieser Methode:

Seek(eof)
Zusatzdaten anhängen

und zum einlesen:
Seek(eof)
zurücklesen bis #0


Wär jetzt nur mal so eine grobe Idee ohne dass ich den Code grad im Kopf hab, aber dass müsste doch funktionieren.

Gruß Matthias

3_of_8 3. Apr 2007 13:42

Re: Datei mit "#0" schreiben?
 
Weil file of <typ> veraltet ist und es dafür FileStreams gibt?

xZise 3. Apr 2007 13:46

Re: Datei mit "#0" schreiben?
 
Also... Danke an den Borg (^^)... Jetzt funktioniert es wunderbar... Er trennt korrekt, und schreibt auch so wie ich das will ;) thx ^^

PS: Wie kann man den im Notepad ein #0 einfügen?

brechi 3. Apr 2007 13:53

Re: Datei mit "#0" schreiben?
 
In Notepad geht das nicht.

Delphi-Quellcode:
var s: String;
begin
  fm := TfileStream.create(...);
  SetLength(s, fm.size);
  Read(s[1], fm.size);
  fm.free;
end;
und dann einfach mit dem String arbeiten, die ganze datei ist da drin

ein String endet immer mit #0, aber er wird nicht bei einer #0 abgeschnitten sondern die Länge wird mitgespeichert

bla := 'blub'#0'hallo' ist ein gültiger String
length(bla) = 10
PChar(bla) = 'blub'
bla[length(bla)+1] = #0


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Seite 2 von 2     12   

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