![]() |
Länge eines Strings vs. verbrauchter Speicherplatz
Ich habe mal eine allgemeine Frage zu Strings und dem Speichern von Strings:
Wenn ich einen String habe und dessen Länge mit length() bestimme, komme ich auf einen anderen Wert als dieser String später als Speicherplatz benötigt. Wie kann das sein? Eigentlich müsste die Länge des Strings der Anzahl von Bytes entsprechen - aber der verwendete Speicher ist immer etwas größer. |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Speicherplatz wo?
|
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Zitat:
Es kommt erstmal auf die Delphi-Version an. Ab Delphi 2009 ist jedes Zeichen 2 Byte lang ... eben Unicode Bei Length('') sind grundsätzlich alle Strings 4 Byte, da sie nur aus dem internen NIL-Pointer bestehen. (abgesehn vom ShortString) ShortString = 256 Byte = 1 LängenByte + 255 Zeichen String[x] = x+1 Byte = 1 LängenByte + x Zeichen String = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(Char) AnsiString = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(AnsiChar) UnicodeString = SizeOf(Pointer) + 2 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(WideChar) WideString = SizeOf(Pointer) + 1 * SizeOf(Integer) + (Length(S) + 1) * SizeOf(WideChar) Ansi-/UnicodeString = internerZeiger + LängenAngabe + Referenzzähler + (Länge + abschließende#0) * Zeichengröße Dazu kommt dann noch die Defragmentierung des jeweiligen SpeicherManagers und dessen Verwaltungsdaten (der WideString wird von der OLE32 verwaltet ... z.B. SysAllocStringLen aus OleAut32.dll) |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Speicherplatz meint wenn der String als Textdatei abgespeichert wird.
Also zum Beispiel: String im Memo (x Zeichen) -> SaveAsFile -> Datei.txt (x Bytes) @himitsu: Die Strings werden nicht als Unicode abgespeichert. Bestimmt habe ich den Speicherbedarf dann im Explorer über die Dateiinformationen. Ich schau mal ob ich mit deinen Formeln die Berechnung hinbekomme.. Ähm, wie bestimme ich denn SizeOf(Pointer) und SizeOf(Integer) wenn der Text einfach nur in einem Memo vorliegt? Also zum Beispiel wenn ein Benutzer einen Text eingeben kann und dann eine Vorschau angegeben wird, wie viel dieser Text an Speicher verbrauchen wird. |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
in der Datei befindet sich ja nur der String-Inhalt
Zitat:
Length(Memo.Text)? |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Genau, mit length(memo1.text).
Ist das falsch? |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Delphi-Quellcode:
Also bei mir stimmen Dateigröße und der Wert im Label überein. :gruebel:
Memo1.Lines.SaveToFile('a.txt');
Label1.Caption := IntToStr(Length(Memo1.Text)); ich hätte jetzt maximal 2 Byte mehr erwartet (Zeilenumbruch nach der letzen Zeile ... die normale TStringList hat da ein paar kleine Problemchen) |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Oh.. Das stimmt bei mir auch überein, wie ich gerade bemerkt habe. Offenbar passiert der Fehler beim Laden der Datei.
Also wenn ich eine Datei zum Beispiel mit dem Editor erstellt habe, diese lade und dann wieder abspeichere, ändert sich die Größe. Zum Laden verwende ich folgende Funktion:
Delphi-Quellcode:
Ich hatte nicht gedacht, dass der Fehler beim Laden passiert, da die Datei im Programm richtig angezeigt wird. Mache ich da irgendetwas falsch?
try
AssignFile(Datei, 'dateiname'); Reset(Datei, 1); repeat BlockRead(Datei, Buffer, SizeOf(Buffer), NumRead); //Buffer ist array[1..1024] of Char temp:=temp+Buffer; until (NumRead < SizeOf(Buffer)); finally CloseFile(Datei); end; result:=temp; |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Unterschiedliche Zeilenumbrüche
Das Memo verwendet die #13#10 (Windows), wärend einige Editoren nur eine #10 (Linux) speichern, dabei wird dieses beim Einlesen umgewandelt. |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Ok, Danke. Daran kann es liegen. Und die Prozedur zum Einlesen birgt nicht irgendwelche andere Fehlerquellen?
Wenn ich nämlich die Datei immer wieder lade und speichere wird sie bei jedem mal größer.. Das dürfte ja auch nicht sein. Edit: Ich hab den Fehler. Die Funktion zum Laden der Datei scheint zu viel zu laden, am Ende befinden sich immer noch Stellen von anderen Dateien. Kann jemand sagen was daran falsch ist??? |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Zitat:
Nee, klappt nicht. martinf16, dein Karma versperrt die Sicht auf den Quellcode. Du müsstest ihn doch ausnahmsweise hier reinposten. Ich weiss, es ist profan und billig, aber anders kommen wir nicht weiter. :zwinker: |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Zitat:
Ohhh alzaimaar.. hiiieeerr: Zitat:
|
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Die Anzahl der gelesenen Byte wird hier überhaupt nicht ausgewertet.
Blockread setzt kein #0 Zeichen ans Ende der gelesenen Daten. Deshalb wird bei temp := temp + buffer noch zusätzlicher Speichermüll hinter den gelesenen Daten an temp angehängt. |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Zitat:
Zitat:
|
Re: Länge eines Strings vs. verbrauchter Speicherplatz
So sollte es gehen:
Delphi-Quellcode:
Warum nimmst du eigentlich nicht die LoadFromFile Funktion von TStrings?
try
AssignFile(Datei, 'dateiname'); Reset(Datei, 1); repeat BlockRead(Datei, Buffer, SizeOf(Buffer), NumRead); //Buffer ist array[1..1024] of Char temp:=temp+Copy(Buffer, 1, NumRead); until (NumRead < SizeOf(Buffer)); finally CloseFile(Datei); end; result:=temp; Ciao Chris |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Vielen Dank, jetzt funktionierts.
Ich benutze den Code so, aus verschiedenen Gründen. Zum Beispiel gibt LoadFromFile Probleme bei dem Zeichen #0 und nicht alle Dateien müssen auch im Memo angezeigt werden, so dass ein Memo1.Lines.LoadFromFile auch wenig Sinn macht. |
Re: Länge eines Strings vs. verbrauchter Speicherplatz
Es gibt auch TStringList. Damit kannst du auch Text laden und dann entweder über Strings[i] auf einzelne Zeilen zugreifen oder über Text auf den gesamten Text als ein String.
Ciao Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr. |
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 by Thomas Breitkreuz