CR LF nach 128 Zeichen

Für Fragen von Einsteigern und Programmieranfängern...

CR LF nach 128 Zeichen

Beitragvon benutzername123 » 22. Feb 2017, 10:13 CR LF nach 128 Zeichen

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³
benutzername123
 
Beiträge: 4
Registriert: 22. Feb 2017, 09:10

Beitragvon wp_xyz » 22. Feb 2017, 10:24 Re: CR LF nach 128 Zeichen

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;
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon benutzername123 » 22. Feb 2017, 11:25 Re: CR LF nach 128 Zeichen

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
benutzername123
 
Beiträge: 4
Registriert: 22. Feb 2017, 09:10

Beitragvon wp_xyz » 22. Feb 2017, 11:36 Re: CR LF nach 128 Zeichen

Oh, ReadBuffer hat keinen Rückgabewert. Nimm Read stattdessen. Also
Code: Alles auswählen
  n := instream.Read(buf, BUFSIZE); 
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon benutzername123 » 22. Feb 2017, 11:58 Re: CR LF nach 128 Zeichen

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?
benutzername123
 
Beiträge: 4
Registriert: 22. Feb 2017, 09:10

Beitragvon wp_xyz » 22. Feb 2017, 12:19 Re: CR LF nach 128 Zeichen

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?
wp_xyz
 
Beiträge: 2249
Registriert: 8. Apr 2011, 08:01

Beitragvon benutzername123 » 22. Feb 2017, 12:42 Re: CR LF nach 128 Zeichen

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

Vielen Dank wp_xyz :)
benutzername123
 
Beiträge: 4
Registriert: 22. Feb 2017, 09:10

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried