CR LF nach 128 Zeichen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
benutzername123
Beiträge: 4
Registriert: Mi 22. Feb 2017, 09:10

CR LF nach 128 Zeichen

Beitrag von benutzername123 »

Hallo zusammen,

ich habe folgendes Problem:

Ich habe eine Stringlist in einem Stream geladen. Die geladene Stringlist sieht zum Beispiel so aus:

Code: Alles auswählen

12345678910111     141516        11641616123123678910111    142316        11641236123455432910111    167516        11641616123456789101111    141516        11641616


Alles in einer Zeile geschrieben. Ich würde gerne jetzt nach dem 128 Zeichen ein Zeilenumbruch machen. Und das so lange bis der Stream komplett untereinander steht (z. B. so:)

Code: Alles auswählen

12345678910111     141516        11641616
123123678910111    142316        11641236
123455432910111    167516        11641616
123456789101111    141516        11641616
 


Der Stream soll danach gespeichert werden. Also das Laden und das Speichern ist kein Problem, aber wie bekomme ich dem Stream(bzw. in der Stringlist) die Zeilenumbrüche hin?

Code: Alles auswählen

PROCEDURE Filter ( VAR inStream, outStream : TStream; VAR filterRes : INTEGER );
VAR sl : TStringList;
   i : INTEGER;
BEGIN
   sl := TStringList.Create;
   sl.LoadFromStream ( inStream );
//Hier müsste der Zeilenumbruch in der Schleife folgen
 
  sl.SaveToStream ( outStream );
   filterRes := fiUseoutput;
   sl.Free;
END;



Kann mir wer paar Tipps geben oder iwelche Seiten verlinken, die mir helfen könnten, denn derzeit habe ich nichts gebrauchvolles gefunden und werde nicht schlauer.
Bin zwar noch fleißig am rumprobiere, aber wäre um hilfreiche Tipps / Gedankenanstöße sehr dankbar.

Vielen Dank. :)


MFG
Anfänger³

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: CR LF nach 128 Zeichen

Beitrag von wp_xyz »

Ungetestet:

Code: Alles auswählen

PROCEDURE Filter ({ VAR } inStream, outStream : TStream; VAR filterRes : INTEGER )
  // kein VAR vor den Streams - diese existieren ja schon
const
  BUFSIZE = 128;
VAR
  buff: array[0..BUFSIZE-1] of byte;
  le: String;
  n: Integer;
BEGIN
  le := LineEnding;
  inStream.Position := 0;
  while inStream.Position < inStream.Size do begin
    // 128 Bytes einlesen. Der letzte Block kann kleiner sein. Die Zahl der gelesenen Bytes steht in n.
    n := instream.ReadBuffer(buf, BUFSIZE);
    // Gelesene Bytes in the OutStream schreiben
    outstream.WriteBuffer(buf, n);
    // LineEnding schreiben, aber nicht nach dem letzten Block
    // (Falls du ein LineEnding auch nach dem letzten Block willst, entferne das "if").
    if (n = BUFSIZE) and (inStream.Position < inStream.Size) then
      outstream.WriteBuffer(le[1], Length(le));
  end;
  filterRes := fiUseoutput;
END;

benutzername123
Beiträge: 4
Registriert: Mi 22. Feb 2017, 09:10

Re: CR LF nach 128 Zeichen

Beitrag von benutzername123 »

Hallo wp_xyz,

vielen Dank für deine schnelle Hilfe.

Also ich habe gerade deinen Code probiert. Als erstes musste ich noch die Variable "buff" auf "buf" ändern damit das in der Procedure klappt.
Danach erhielt ich leider die Nachricht "Type mismatch" in welchem Datentyp wird mir das den wiedergegeben?

Freundliche Grüße
benutzername123

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: CR LF nach 128 Zeichen

Beitrag von wp_xyz »

Oh, ReadBuffer hat keinen Rückgabewert. Nimm Read stattdessen. Also

Code: Alles auswählen

  n := instream.Read(buf, BUFSIZE); 

benutzername123
Beiträge: 4
Registriert: Mi 22. Feb 2017, 09:10

Re: CR LF nach 128 Zeichen

Beitrag von benutzername123 »

Hmm, bekomme leider immer noch den Fehler das es ein Falscher Datentyp sei.
Muss die constante vill auch eine Variable sein die man dem Datentyp Byte zuweist?


Gibt es keine Möglichkeit der Stringlist den Zeilenumbruch mitzugeben? :(

Kombination mit Lenght() und Delete() oder ähnliches?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: CR LF nach 128 Zeichen

Beitrag von wp_xyz »

Ich habe die Prozedur eben getestet, und nach den beiden Änderungen (buff --> buf, ReadBuffer --> Read) funktioniert sie einwandfrei.

In welcher Zeile kommt denn der Fehler? Bei welcher Variablen? Welche Streams sind InStream und Outstream genau? TMemoryStream, TFileStream, oder ganz andere? Wie erzeugst du die Streams? Was ist FilterRes? Was ist fiUseOutput?

benutzername123
Beiträge: 4
Registriert: Mi 22. Feb 2017, 09:10

Re: CR LF nach 128 Zeichen

Beitrag von benutzername123 »

Scheint jetzt doch alles zu klappen, hatte bloß blöderweise ein Wert falsch eingetippt. :O

Vielen Dank wp_xyz :)

Antworten