AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WriteLN + Zeilenumbruch

Ein Thema von Pandax3 · begonnen am 29. Jan 2012 · letzter Beitrag vom 30. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2      
Pandax3

Registriert seit: 16. Jul 2011
22 Beiträge
 
#1

WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 01:14
Hallo,
ich habe folgendes Problem was mich zum verzweifeln bringt:

Ich schreibe Zeilen in eine Textdatei mit WriteLn was an sich ganz gut klappt.
Wenn ich dann aber ein Edit Feld ergänze und es wieder speichere, dann schreibt er die alte Zeile, macht danach einen Zeilenumbruch und schreibt in die neue Zeile die Ergänzung.

Wenn ich z.B. in Edit1 "Test" drin stehen habe, das speichere, dann schreibt Delphi das auch so in die Textdatei,
wenn ich nun aus "Test" "Test1" mache und wieder speichere, habe ich 2 Zeilen in der Textdatei:
1. Zeile: Test
2. Zeile: 1

Zudem setzt Delphi mir nach jedem Speichern einen Zeilenumbruch zwischen die verschiedenen Zeilen, sodass die Datei immer größer und die Zeilenabstände ebenfalls immer größer werden.

Ich komm nicht dahinter woran das liegen kann
Gibt irgendwie keinen Sinn

Habe schon probiert die Textdatei vor dem Speichern komplett zu löschen und neu anzulegen, aber dann tritt dasselbe Problem auf.

Danke schon mal

Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var
f:TextFile;
Punkte:String;
i:integer;
begin
Punkte:='........................................'; // 40 Punkte
i:=0;

{if fileexists(Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text) then
  DeleteFile(Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text);

  !auch wenn ich die Datei lösche, dann schreibt er in mehrer Zeilen und macht zeilenbrüche >.<!}


AssignFile(f,Label2.Caption+'\'+Combobox1.text+'\'+edit3.Text);
{$I-}
Rewrite(f);
{$I+}
if IOResult<>0 then showmessage('Fehler beim Speichern.');

for i := 0 to memo1.Lines.Count do
    WriteLn(f,memo1.Lines[i]);

WriteLN(f,'..........Informationen zu "'+Combobox1.text+'"..........');

Write(f,#10#13); // Zeilenumbruch (hieran liegt es nicht!)
WriteLn(f,'TEST'+Punkte+Edit1.Text);
WriteLn(f,'TEST'+Punkte+Edit2.Text);
WriteLn(f,'TEST'+Punkte+Edit3.Text);
WriteLn(f,'TEST'+Punkte+Edit4.Text);
WriteLn(f,'TEST'+Punkte+Edit5.Text);
WriteLn(f,'TEST'+Punkte+Edit6.Text);
WriteLn(f,'TEST'+Punkte+Edit7.Text);
WriteLn(f,'TEST'+Punkte+Edit8.Text);
WriteLn(f,'TEST'+Punkte+Edit9.text);
WriteLn(f,'TEST'+Punkte+Edit10.text);
WriteLN(f,'TEST'+Punkte+Edit11.Text);
WriteLN(f,'TEST'+Punkte+Edit12.Text);

closefile(f);

TextLaden; // Hieran liegt es auch nicht
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 01:46
Delphi schreibt garantiert nicht einfach so von sich aus irgendwelche Zeilenumbrüche (abgesehn von dem Einen im WriteLn, welches man dann aber selber so will)

Wie sieht TextLaden aus?


Zitat:
Delphi-Quellcode:
for i := 0 to memo1.Lines.Count do
    WriteLn(f,memo1.Lines[i]);
Sicher daß daß so funktioniert?
0 bis Count ist eine Zeile zuviel und dort sollte sich die StringListe des Memos doch eigentlich beschweren (0 to Count - 1)

Zitat:
Delphi-Quellcode:
{$I-}
Rewrite(f);
{$I+}
if IOResult<>0 then showmessage('Fehler beim Speichern.');
 ...
Wenn die Datei nicht geöffnet werden konnte, zeigst du eine Message an.
Soweit ist es ja OK, aber dann wird dennoch versucht die Schreibfunktionen auszuführen, was auch nicht gut Enden wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jan 2012 um 01:52 Uhr)
  Mit Zitat antworten Zitat
HiWieGehts

Registriert seit: 19. Aug 2005
101 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 09:35
Hallo,

in deinem Edit1 steht 'Test'#10#13. Dann schreibst du 1 dazu und speicherst das ganze. Damit zeigt dir jeder Editor 2 Zeilen an. Probier einfach mal den Debugger - da wird dir alles angezeigt und du findest den Fehler sicher ohne Probleme, welcher beim Schreiben in Edit1 passiert.
LG, HiWieGehts
  Mit Zitat antworten Zitat
Pandax3

Registriert seit: 16. Jul 2011
22 Beiträge
 
#4

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 12:20
Erstmal Danke an euch beide

TextLaden lädt den Text nur noch mal ins Memo. Daran liegt das nicht, das habe ich auch schon auskommentiert und nach dem Speichern in die Textdatei geschaut und die Zeilenbrüche waren auch vorhanden.

Mhm zum 2. Punkt von himitsu: Selbst wenn ich
Delphi-Quellcode:
for i := 0 to memo1.Lines.Count+10 do
    WriteLn(f,memo1.Lines[i]);
schreibe kommt keine Fehlermeldung, sondern Delphi schreibt nur leere Zeilen , aber das hat ja nichts mit den Zeilenbrüchen zu tun.

Zitat:
Delphi-Quellcode:
{$I-}
Rewrite(f);
{$I+}
if IOResult<>0 then showmessage('Fehler beim Speichern.');
 ...
gute Kritik, aber bis jetzt hatte ich noch keinen Fehler.


zu HiWieGehts:
woher kommen denn die "#10#13" und wie kann ich das verhindern bzw. umgehen?
  Mit Zitat antworten Zitat
Pandax3

Registriert seit: 16. Jul 2011
22 Beiträge
 
#5

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 12:29
HiWieGehts hatte Recht.

wenn ich vor dem Speichern dies davor setze:
if pos(#13#10,Edit1.Text) <> 0 then showmessage('vorhanden'); bekomme ich die Meldung 'vorhanden'.

Jetzt frag ich mich halt nur woher das kommt? Oder wie kann ich das rauslöschen? Das ist noch nicht normal das an ein Edit "#13#10" gesetzt wird, oder?

Danke schon mal
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 12:33
woher kommen denn die "#10#13" und wie kann ich das verhindern bzw. umgehen?
Rate mal, warum ich nach der Einlesefunktion gefragt hab?

gute Kritik, aber bis jetzt hatte ich noch keinen Fehler.
Gib mal einen falschen Pfad an (nichtexistierendes Verzeichnis) oder ein Verzeichnis, bzw. eine Datei, wo für das Programm keine Schreibrechte existieren.

Wobei es auch unpraktisch ist, den eigentlichen Fehlergrund zu verschleiern, denn dann weiß man zwar daß etwas nicht geht, aber nicht warum.
Delphi-Quellcode:
if IOResult = 0 then begin
  ... hier die Dateizugriffe
end else
  ShowMessage('Fehler beim Speichern.' + sLineBreak + SysErrorMessage(IOResult));
Was man nun vermutlich erfahren würde.


Die Steuerzeichen #13 und #10 sind in einem Edit schon erlaubt, nur daß sie dort nicht als Zeilenumbruch/Steuerzeichen, sondern als stinknormale Zeichen interpretiert werden.
(so wie ein Texteditor <B> als Text behandelt, was ein Webbrowser nicht macht, sobald er den Text als HTML interpretiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jan 2012 um 12:37 Uhr)
  Mit Zitat antworten Zitat
Pandax3

Registriert seit: 16. Jul 2011
22 Beiträge
 
#7

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 12:58
ok du hattest Recht
ich habe beim Auslesen der Textdatei einen Fehler gemacht und habe die Zeilenbrüche mit ausgelesen, habe jetzt überall 2 Zeichen abgezogen und er liest die Zeilenbrüche nicht mehr ein

Danke für eure Hilfe

Habe jedoch noch schnell 2 Fragen:

ShowMessage('Fehler beim Speichern.' + sLineBreak + SysErrorMessage(IOResult)); Hat sLinebreak diesselbe Bedeutung wie "#13#10" ?

wieso tritt bei
Delphi-Quellcode:
for i := 0 to memo1.Lines.Count+10 do
    WriteLn(f,memo1.Lines[i]);
kein Fehler auf?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 13:24
OK, MSDN-Library durchsuchenEM_GETLINE ignoriert nichtexistierende Zeilen und gibt einen Leerstring zurück. (hätte erwartet, daß dieses geprüft wird)
Versuch das aber mal bei einer TStringList oder einer anderen Liste, wie TList und Co.
Bei dynamischen Arrays vergessen viele probehalber mal die Bereichsprüfung in den Projektoptionen zu aktivieren, was oftmals in Zugriffsverletzungen oder gar in einem Bufferoverrun resultiert.

Delphi-Referenz durchsuchensLineBreak ist unter Windows #13#10 (CRLF), was dort den Standardzeilenumbruch darstellt.
Kompiliert man eine Linux-Anwendung, ist es eine #10 und für MAC ist es eine #13. (Kylix oder XE2)
Es paßt sich also ans Zielsystem an.

[edit]
Ohh, wieso gibt's das nicht in der OH?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jan 2012 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 13:25
Man ist eigentlich gut beraten sich für das Speichern von Daten, die man später auch wieder einlesen und verarbeiten möchte, ein möglichst einfach zu lesendes Format zu verwenden.

Ein Human-Readable-Format ist für ein Programm meistens schlecht/umständlich zu verarbeiten - und auch umgekehrt.

Speicher die Daten in 2 Dateien ... eine im Human-Readable-Format (nur zum lesen) und in einem weiteren Format, welches sich auch wieder einfach auslesen lässt.
In diesem Fall könnte dir z.B. auch eine schnöde Ini-Datei helfen Delphi-Referenz durchsuchenTIniFile
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Pandax3

Registriert seit: 16. Jul 2011
22 Beiträge
 
#10

AW: WriteLN + Zeilenumbruch

  Alt 29. Jan 2012, 13:35
@himitsu danke für die erklärung

@Sir Rufo, kann schon sein, dass das mit einer .ini einfacher geht, aber jetzt läufts ja Merk ich mir fürs nächste Mal
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz