AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Problem mit writeln (Text erstellen)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit writeln (Text erstellen)

Ein Thema von Boyington · begonnen am 22. Jun 2012 · letzter Beitrag vom 25. Jun 2012
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 15:31
.. ich möchte dann mal die Folgende Klassen TStreamWriter
und TStreamReader in den Raum werfen.

Delphi-Referenz durchsuchenTStreamWriter.WriteLine
Delphi-Referenz durchsuchenTStreamReader.ReadLine

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 16:32
Zu kurz geworfen,in D7 unbekannt,
wie wäre es mit TStringStream ?
aber da fehlt mir die Angabe der Datei aus der ich lesen will.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.519 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 16:45
TStringStream + TFileStream




Text-Dateien haben auch ohne SetTextBuf schon einen komischen 128 Byte-Puffer.

Das paßt nichtmal im Geringsten zur ClusterSize der Partitionen oder zur SectorSize der Datenträger.

Beim Lesen ist ein Puffer OK, aber wozu beim Schreiben?
Die Daten gehen sowieso nochmal durch die WFC (Windows File Cache ... das Teil, welches den RAM voll macht) und dann nochmal durch verschiedenste Caches.

Wenn das Programm abstürtzt, sind diese Daten weg, was geade bei LogDateien etwas blöd ist, vorallem wenn man das Warum wissen will.

Delphi-Quellcode:
var
  F: TextFile;
  B: Byte; // für LogDateien so klein wie möglich (0 ist leider nicht möglich) und ansonsten wäre es ein bissl größer nicht schlecht.
begin
  AssignFile(F, 'Text.dat', CP_UTF8); // Ja, wir können jetzt sogar unicode, auch wenn die BOM nicht automatisch rein kommt.
  System.SetTextBuf(F, B);
  Rewrite(F);
  WriteLn(F, '123456');
  CloseFile(F);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 17:01
Wenn das Programm abstürtzt, sind diese Daten weg, was geade bei LogDateien etwas blöd ist, vorallem wenn man das Warum wissen will.
Genau das ist ja der Grund für mich da mal auf writeln zurück zu greifen.
Nach meinem Kenntnisstand wird der Buffer bei einem Closefile weggeschrieben, also seh ich da keine Gefahr des Datenverlustes (natürlich für jede Zeile das append,writeln,closefile)
Was den Buffer angeht und den Tstream vielleicht komm ich am WE mal dazu etwas zu Teste ob es da signifikante Geschwindigkeitsunterschiede gibt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.519 Beiträge
 
Delphi 12 Athens
 
#5

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 18:16
Genau das ist ja der Grund für mich da mal auf writeln zurück zu greifen.
Nach meinem Kenntnisstand wird der Buffer bei einem Closefile weggeschrieben,
Nein und genau deswegen.

Bei CloseFile landen die Daten auch nur in der WFC.
Also genauso wie bei den FileStreams, denn FileStream und das Pascal-Zeugs nutzen intern die selbe WinAPI, abgesehn von dem zusätzlichen Caching der Delphi-Referenz durchsuchenTextFile.

Append tut erstmal das Ende der Datei einlesen um das vermeintliche Ende zu suchen.

Die alten Pascal-Funktionen sind also, in Bezug auf den Absturz des Programms eher im Nachteil.
- entwerder potentieller Datenverlust, bei geöffneten Dateien
- oder Overkill durch das ständige Öffnen und Schließen

Beim FileStream kann es offen bleiben und es kommt dennoch nichts weg, wenn das Programm abstürzt.


Wenn der ganze Computer verrekt, kann man durch entsprechende Optionen das Caching des FileStreams beeinflussen und auch da für ein sichereres Speichern sorgen, selbst wenn Windows verrekt.
Alternativ müstest du dir dafür ein eigenes AssingFile programmieren und die internen Open-/Closefunktionen ebenfalls durch eigene Versionen ersetzen und zusätzlich erstmal die Interna ergründen, da hierzu nichts in der OH drinsteht.
Beim FileStream, bzw. Delphi-Referenz durchsuchenTHandleStream+MSDN-Library durchsuchenCreateFile kannst du über die OH und das MSDN alles direkt erfahren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (22. Jun 2012 um 18:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Problem mit writeln (Text erstellen)

  Alt 25. Jun 2012, 10:41
[QUOTE=himitsu;1172083]
Append tut erstmal das Ende der Datei einlesen um das vermeintliche Ende zu suchen.
Und das kostet, Faktor ca. 1000.
Bei der Gelegenheit hab ich mir die Auswirkungen von Settextbuf auf den Durchsatz angeschaut. sowohl das Schreiben ohne, als auch mit Buffsize=1 bzw Buffsize=8194 hatte keine signifikanten Auswirkungen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Boyington
Boyington

Registriert seit: 12. Apr 2012
43 Beiträge
 
#7

AW: Problem mit writeln (Text erstellen)

  Alt 25. Jun 2012, 08:47
Morgen Zusammen,
danke für eure Antworten, das Problem nun schon gelöst
Ich habe Rewrite(F); und CloseFile(F); einfach vergessen. Jetzt läuft das Programm einwandfrei.

Gruss
Lee
Do the best job, leave the rest in the hands of God!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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-2025 by Thomas Breitkreuz