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
Benutzerbild von p80286
p80286

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

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 14:18
Wenn ich Jaenicke noch etwas ergänzen dürfte,
das CloseFile(f) fehlt ebenfalls.
Ist (war) beliebte Fehlerursache für zu kurze Textdateien.

@DeddyH
Er will eben alle Funktionalitäten erlernen.
Und für Log-Files gibt es meiner Meinung nach nichts besseres als
Assignfile,append,writeln,closefile
(ja das ist wohl kein Logfile, aber es hat zusehr gejuckt)

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.531 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 14:55
Und für Log-Files gibt es meiner Meinung nach nichts besseres als
Assignfile,append,writeln,closefile
Dem würde ich nicht zustimmen.

"nichts Einfacheres" würde stimmen, abgesehn von speziell dafür erstellen Klassen/Bibliotheken, also rein auf die "einfachen"/direkten Dateizugriffsfunktionen bezogen.

"Besseres" gibt es alle Male, vom Caching her sind Streams besser und von der Funktionalität die spezialisierten Klassen.
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
 
#3

AW: Problem mit writeln (Text erstellen)

  Alt 22. Jun 2012, 15:20
Wird zwar etwas OT aber warum
Zitat:
vom Caching her sind Streams besser
.
a) ich müßte bei Strings noch das CRLF hinterher schieben?
b) sogar ohne settextbuf geht es (unter windows)ganz gut.

Liege ich da so falsch?

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

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

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
 
#5

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.531 Beiträge
 
Delphi 12 Athens
 
#6

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
 
#7

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.531 Beiträge
 
Delphi 12 Athens
 
#8

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 Boyington
Boyington

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

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 00:05 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