Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stringlist ohne Zeilenumbruch speichern (https://www.delphipraxis.net/196552-stringlist-ohne-zeilenumbruch-speichern.html)

BMI 30. Mai 2018 12:49

Delphi-Version: 5

Stringlist ohne Zeilenumbruch speichern
 
Hallo, ich würde gerne eine Stringlist speichern, ohne daß hinten noch ein Zeilenumbruch drangepappt wird.

Delphi-Quellcode:
function Zaehl():Boolean ;
var i, j, Max : INteger;
    s: String;
    SL: TStringlist;
begin
SL := TStringlist.create;

s := '';
Max := 4;
  for i := 0 to Max-1 do
     begin
////////////// steht unten ///////////////////
     end;
sl.Clear; //  << SELBST hier bei kommt eine Datei mit 2 Zeichen (=Zeilenumbruch) raus.
SL.Add(s);
sl.SaveToFile ('.\Zahldatei.txt');

SL.free;
END; // function
Was ich eigentlich haben möchte ist eine Stringlist, die eine 4 Zeilen Datei erzeugt, mit den Zahlen von 1-4 untereinander. (ggf später mehr)
also ohne #13#10 ganz unten dran.

Delphi-Quellcode:
function Zaehl():Boolean ;
var i, j, Max : INteger;
    s: String;
    SL: TStringlist;
begin
SL := TStringlist.create;

s := '';
Max := 4;
   for i := 0 to Max-1 do
     begin
//
      if i < Max -1   then // bei -1 pappt er die 3 direkt an die 4 und dann kommt nocho ein Zeilenumbruch.
         S:= S +   inttostr(i+1) // + #13#10
      else
         S:= S +  inttostr(i+1);
//
end;
SL.Add(s);
sl.SaveToFile ('.\Zahldatei.txt');

SL.free;
END; // function
gibt mir aus:
Zitat:

1
2
3
4
_
_ steht hier für den Zeilenumbruch

1) Wie kann ich das abstellen?
2) und wozu ist/ war die Funktion ("auch bei StringListen unten immer #13#10 anhängen") damals gut/ implementiert worden?
Ich hatte mich da nur beim Memo immer über den angehängten Zeilenumbruch geärgert + gewundert, aber daran gewöhnt, da der bei der Verarbeitung von memo.text nie auftauchte und nur bei der Ausgabe im Memo wieder auftauchte.

Wenn ich Einstellungen einer Datei speicherte, war mir das immer egal, denn alles funktionierte auch später beim Laden in eine Stringlist.

Ich wüßte aber jetzt auch nicht, unter welchem Stichwort ich nacsuchen/nachschlagen müßte.

Uwe Raabe 30. Mai 2018 14:13

AW: Stringlist ohne Zeilenumbruch speichern
 
Aktuelle Delphi-Versionen kannst du mit
Delphi-Quellcode:
SL.TrailingLineBreak := False
dazu bewegen.

Zitat:

When TrailingLineBreak property is True (default value) then Text property
will contain line break after last line. When it is False, then Text value
will not contain line break after last line. This also may be controlled
by soTrailingLineBreak option.

himitsu 30. Mai 2018 14:55

AW: Stringlist ohne Zeilenumbruch speichern
 
Ich hatte zuletzt mit
Delphi-Quellcode:
TFile.WriteAllText('dat.ei', TrimRight(SL.Text));
:oops:

BMI 30. Mai 2018 19:03

AW: Stringlist ohne Zeilenumbruch speichern
 
Dank Euch.

Allerdings sollte die Stringlist dann bei TrimRight(SL.Text)) aber wohl besser auch nicht zu lang (z.B. ein paar hundert MB oder gar GB) sein, oder? (damit das nicht dadurch gebremst wird)

Aber nen sinnvollen Grund seitens Borland/aka Emba gab/gibt es für die Implementierung der Nachgelagerten Zeile nicht, oder?
http://docwiki.embarcadero.com/Libra...ilingLineBreak

oder hatte das damals evtl. Speicher/Ladetechnische Gründe?
aber eigentlich leuchtet mir das nicht ein.

Uwe Raabe 30. Mai 2018 20:29

AW: Stringlist ohne Zeilenumbruch speichern
 
Immerhin hat dann jede Zeile garantiert ein LineBreak am Ende.

KodeZwerg 30. Mai 2018 20:39

AW: Stringlist ohne Zeilenumbruch speichern
 
Zitat:

Zitat von BMI (Beitrag 1403445)
2) und wozu ist/ war die Funktion ("auch bei StringListen unten immer #13#10 anhängen") damals gut/ implementiert worden?

Vielleicht damit man über "f: File" ein "ReadLn(f)" machen kann?
Theoretisch kannst Du mit Read/ReadLn bzw Write/WriteLn das ganze locker hinbekommen.


hier nur mal so hingekritzelt, kann sein das was falsch ist....
Delphi-Quellcode:
function SchreibDasFile (const DateiName: String; const SL : TStringlist): Boolean;
// Parameter 1 = Ein valider Dateiname
// Parameter 2 = Eine StringList
var
  Datei: TextFile;
  Cnt: Byte; // wenn Deine SL mehr als 255 Einträge hat solltest Du das hier erweitern (!)
begin
  Result := False;
  try
    AssignFile(Datei, DateiName);
    Rewrite(Datei);
    if {$I-}IOResult = 0{$I+} then
    begin
      for Cnt := 0 to SL.Count -2 do
        writeln(Datei, SL[Cnt]); // <- hier wird alles mit Zeilenumbruch geschrieben
      write(Datei, SL[SL.Count -1]); // <- hier nicht
      CloseFile(Datei);
    end;
  finally
    Result := True;
  end;
end;

p80286 30. Mai 2018 20:57

AW: Stringlist ohne Zeilenumbruch speichern
 
Zitat:

Zitat von BMI (Beitrag 1403471)
Aber nen sinnvollen Grund seitens Borland/aka Emba gab/gibt es für die Implementierung der Nachgelagerten Zeile nicht, oder?

Das ist ein Mißverständnis.
Das Ende einer "Textzeile" wird durch x0D0A definiert. Ersatzweise ist ein x1A für die letzte Zeile zulässig.

Das was Du als "nachgelagerte Zeile" identifizierst ist die die erste Position einer noch zu schreibenden Zeile.

Gruß
K-H

@KodeZwerg
für IOResult mußt Du aber unbedingt {$I-} nutzen, und das ist nicht immer bei allen Programmen der Fall.

KodeZwerg 30. Mai 2018 21:09

AW: Stringlist ohne Zeilenumbruch speichern
 
Zitat:

Zitat von p80286 (Beitrag 1403484)
Das Ende einer "Textzeile" wird durch x0D0A definiert.

EOL / End Of Line
EOF / End Of File

was Du da schreibst ist ein Zeilenumbruch (CRLF).

Zitat:

Zitat von p80286 (Beitrag 1403484)
für IOResult mußt Du aber unbedingt {$I-} nutzen, und das ist nicht immer bei allen Programmen der Fall.

Habs nachgebessert, Danke.

p80286 31. Mai 2018 08:11

AW: Stringlist ohne Zeilenumbruch speichern
 
Wie ist denn "EOL" definiert?

Wie wir ja alle wissen ist es reine Interpretationsfrage wie die Steuercodes genutzt werden.
Das "CarriageReturn Linefeed" war ja für viele Drucker/Fernschreiber die Sequenz mit der der Cursor in die 1. Position der nächsten Zeile bewegt wurde. Andere interpretierten das "LineFeed" alleine als die notwendige Aufforderung. Auf diesen Geräten wurde dann gerne "VerticalTab" x0B als reiner Zeilenvorschub genutzt.
Das gilt ja auch nur für Systeme die auf der TTY-Philosophie aufbauen. In HTML oder bei fixen Satzlängen werden die Steuerzeichen meist nur als Whitespaces interpretiert.

vgl.


https://de.wikipedia.org/wiki/Steuerzeichen

Gruß
K-H

KodeZwerg 31. Mai 2018 08:41

AW: Stringlist ohne Zeilenumbruch speichern
 
Ich will auf gar keinen Fall stänkern oder klugscheissen, aber loswerden will ichs trotzdem irgendwie.
EOL = es gibt dafür keine eindeutige Bytesequenz, es sind Faktoren.

Angenommen Du erstellst mit Notepad einen Einzeiler OHNE CRLF. Wie ist da EOL definiert? Richtig, über EOF :-)
Kommen CR oder LF vor, kann das auch ein EOL bedeuten, je nachdem wie die folgebytes ausschauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr.
Seite 1 von 2  1 2      

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