(Co-Admin)
Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
Delphi 11 Alexandria
|
Re: Problem mit TFileStream und Write Read
8. Jul 2008, 19:50
Moin Christian,
nein, wenn Du den Index weglässt, wird der Pointer geschrieben, den die StringVariable enthält, sowie eben alles, was zufällig dahinter im Speicher steht.
Beispiel
Delphi-Quellcode:
// Länge meint hier den Wert, den SizeOf zurückliefern würde
var // Adresse: Länge: Inhalt
s : string; // 4712 4 Unbekannt
w : word; // 4716 2 Unbekannt
// 4718 2 Unbekannt (nicht genutzt, weil, i.d.R. Alignment 4)
i : integer; // 4720 4 Unbekannt
begin
s := 'TESTWERT'; // Adresse: 4712 / Länge: 4 Inhalt: $401F0000 (8000 dezimal)
// Adresse: 7992 / Länge: 4 Inhalt: $01000000 (Referenzzähler, 1 dezimal)
// Adresse: 7996 / Länge: 4 Inhalt: $08000000 (Länge des Strings, 8 dezimal)
// damit ein String in C-Funktionen direkt genutzt werden kann, legt
// der Compiler automatisch eine binäre 0 als Endekennung dahinter
// Adresse: 8000 / Länge: 4 Inhalt: TESTWERT#00
w := 50; // Adresse: 4716 / Länge: 2 Inhalt: $3200 (50 dezimal)
// Adresse: 4718 / Länge: 2 Inhalt: unbekannt
i := 1000; // Adresse: 4720 / Länge: 4 Inhalt: $E8030000 (1000 dezimal)
// Wenn man jetzt
fs.Write(s,Length(s));
// schreiben würde, würde in der Datei folgendes stehen (Hexadezimal)
// Annahme: Die Variablen würden so im Speicher stehen, wie oben
// angegeben, was aber nicht der Fall sein muss.
// Diese Annahme dient hier nur der Verdeutlichung.
//
// 401F00003200????
// Es werden also die Adresse des Strings, sowie der Wert von w in die Datei geschrieben.
// Der Wert der verbleibenden zwei Bytes ist unbekannt
// Bei
fs.Write(i,SizeOf(i));
// wird E8030000 in der Datei stehen, bei
fs.Write(w,SizeOf(w));
// ist es dann 3200.
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
|
|
Zitat
|