Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zeichen einem String hinzufügen... [gelöst]
kostenix - Mo 24.05.04 13:15
Titel: Zeichen einem String hinzufügen... [gelöst]
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var Zeilenlaenge := 225; var dazu := 0; var Textzeile := 'T E X T'; var leerzeichen := ' '; Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin dazu := Zeilenlaenge - Size; x := 1; repeat Textzeile := Textzeile+leerzeichen; x := x+1; until x = dazu; end; Writeln(F2, Textzeile); |
wieso zeigt er es in der konsole mit 255 zeichen und in der textdatei mit weniger? in der textdatei wurden nur einpaar hinzugefügt...
PS: das macht der nur bei der letzten zeile so...
Moderiert von
Peter Lustig (13:20, 24.05.2004): Code- durch Delphi-Tags ersetzt
FaTaLGuiLLoTiNe - Mo 24.05.04 13:40
Also erstmal ist das was du da machst irgendwie sehr kompliziert. Es hätte auch so gelöst werden können:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var Zeilenlaenge := 225; var Textzeile := 'T E X T'; var Leerzeichen := ' ';
While (Length(Textzeile) < Zeilenlaenge) do Textzeile := Textzeile + Leerzeichen; Writeln(F2, Textzeile); |
Von einer Konsolenausgabe kann ich in deinem Quelltext nichts finden. Ich verstehe auch nicht ganz, was du damit meinst:
kostenix hat folgendes geschrieben: |
PS: das macht der nur bei der letzten zeile so...
|
So wie ich das sehe behandelt diese Prozedur nur eine einzige Zeile. Deshalb kann ich dein Problem nicht ganz nachvollziehen.
kostenix - Mo 24.05.04 13:52
okay beschreibe ich mein programm.
am anfang werden 2 dateinamen eingegeben. eine die schon vorhanden ist (F1), und eine die erts angelegt werden soll (F2). das klappt auch wunderbar.
dann wird die erste zeile aus in die variable "Textzeile" geladen. diese wird überprüft ob sie 225 beinhaltet. wenn nicht wird sie mit leerzeichen aufgefüllt. und diese erste zeile wird sofort in die neue datei (F2) geschrieben. das klappt auch noch wunderbar:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Textzeile := ReadLine(Dateiname_alt,0); Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin dazu := Zeilenlaenge - Size; for x := 1 to dazu do begin Textzeile := Textzeile+leerzeichen; end; end; Writeln(F2, Textzeile); |
dann werden die zeilen zwischen der ersten und der letzten zeile auf einen bestimmten string durchsucht und aufgefüllt wenn der string vorhanden ist. wenn der string vorhanden ist wird die aufgefüllte textzeile in die neue datei geschrieben. die anzahl der zeilen variieren. das klappt auch wunderbar.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Zeilen := AnzahlZeilen -1; i := 1; repeat Textzeile := ReadLine(Dateiname_alt,i); i := i-1; Size := Length(Textzeile); if POS('12345', Textzeile) = 119 then begin if (Size < Zeilenlaenge) then begin dazu := Zeilenlaenge - Size; for x := 1 to dazu do begin Textzeile := Textzeile+leerzeichen; end; end; Writeln(F2, Textzeile); end; i := i+1 until i = Zeilen; |
nun fehlt nur noch die letzte zeile aus der vorhandenen datei. diese wird ausgelesen und einfach nur aufgefüllt mit leerzeichen bis diese 225 zeichen enthält. und hier klappt es nicht mehr. wenn ich nach dem auffüllen des strings diese an der konsole ausgebe, dann zeigt er alle 225 zeichen an. wenn ich mir dann aber die neue textdatei anschaue, hat diese weniger...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Textzeile := ReadLine(Dateiname_alt,AnzahlZeilen); Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin dazu := Zeilenlaenge - Size; Writeln(dazu); x := 1; repeat Textzeile := Textzeile + leerzeichen; x := x+1; until x = dazu; end; Writeln(F2, Textzeile); |
und das ist nun mein problem. die letzte zeile muss auch genau 225 zeichen enthalten... ansonsten kann ich das programm vergessen...
MartinPb - Mo 24.05.04 14:13
Du machst es sehr kompliziert. Dir ist aber klar, daß du das
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin dazu := Zeilenlaenge - Size; x := 1; repeat Textzeile := Textzeile+leerzeichen; x := x+1; until x = dazu; end; |
auch so lösen kannst:
Delphi-Quelltext
1: 2: 3: 4:
| for x := Length(Textzeile) to Zeilenlaenge do begin Textzeile := Textzeile + leerzeichen; end; |
FaTaLGuiLLoTiNe - Mo 24.05.04 14:13
Da du ja das gleiche Verfahren wie bei den Zeilen davor verwendest und in der Konsole auch das gewünschte Ergebnis bekommst ... kann es eventuell sein dass die aufgefüllten Zeichen für die Ansicht abgeschnitten werden? Welchen Texteditor benutzt du für das Betrachten von F2? Ansonsten kann ich auf Anhieb keinen Fehler finden ...
@MartinPb:
Hatte ich ihm ja auch schon gesagt. Aber da steckt das aktuelle Problem nicht, deswegen erstmal drüber hinwegsehen ... sonst könnte man btw auch gleich noch bemängeln dass er für das Auffüllen besser ne Funktion erstellen sollte (Wiederverwendbarkeit etc.) und der Quelltext im Ganzen noch etwas unübersichtlich ist :wink:
kostenix - Mo 24.05.04 14:31
okay, hier der komplette quellcode (vielleicht versteht ihr es ja dann) :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120:
| program Konverter; {$APPTYPE CONSOLE}
var Zeilenlaenge : Integer; var AnzahlZeilen : Integer; var Zeilen : Integer; var i : Integer; var x : Integer; var Dateiname_alt : String; var Dateiname_neu : String; var Textzeile : String; var Size : Integer; var F1 : TextFile; var F2 : TextFile; var str : String; var ch : Char; var leerzeichen : String;
Function ReadLine(FileName:string; LineNum: Integer): string; begin i := 0; AssignFile(F1, FileName); reset(F1); repeat read(F1, ch); if (ch <> #13) and (ch <> #10) then str:= str + ch else if (ch = #13) then begin inc(i); if (i <> LineNum + 1) then str := ''; end; until (i = LineNum + 1) Or EOF(F1); CloseFile(F1); Result := Str; end;
Function CountLines(FileName:string):integer; begin i := 1; AssignFile(F1,FileName); reset(F1); while not EOF(F1) do begin Readln(F1); Inc(i); end; AnzahlZeilen := i-1; CloseFile(F1); Result := AnzahlZeilen; end;
begin if (ParamStr(1) = '?') OR (ParamStr(1) = 'help') then Writeln('konvert.exe vorhandene_datei neue_datei') else if (ParamCount < 2) OR (ParamCount > 2) then Writeln('Falsche Eingabe! konvert.exe vorhandene_datei neue_datei') else begin Dateiname_alt := ParamStr(1); Dateiname_neu := ParamStr(2);
Zeilenlaenge := 225; leerzeichen := ' ';
CountLines(Dateiname_alt);
AssignFile(F2, Dateiname_neu); Rewrite(F2,Dateiname_neu);
Writeln('Bitte warten, die Datei wird bearbeitet...');
Textzeile := ReadLine(Dateiname_alt,0); Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin for x := Length(Textzeile) to Zeilenlaenge do begin Textzeile := Textzeile + leerzeichen; end; end; Writeln(F2, Textzeile);
Zeilen := AnzahlZeilen -1; i := 1; repeat Textzeile := ReadLine(Dateiname_alt,i); i := i-1; Size := Length(Textzeile); if POS('12345', Textzeile) = 119 then begin if (Size < Zeilenlaenge) then begin for x := Length(Textzeile) to Zeilenlaenge do begin Textzeile := Textzeile + leerzeichen; end; end; Writeln(F2, Textzeile); end; i := i+1 until i = Zeilen;
Textzeile := ReadLine(Dateiname_alt,AnzahlZeilen); Size := Length(Textzeile); if (Size < Zeilenlaenge) then begin for x := Length(Textzeile) to Zeilenlaenge do begin Textzeile := Textzeile + leerzeichen; end; end; Writeln(F2, Textzeile); Writeln('Bearbeitete Zeilen: ',AnzahlZeilen); Writeln('Fertig.'); end;
end. |
ihr könnt es ja mal testen in dem ihr in eine textdatei 15 zeilen von text einfügt und dann mit dem programm konvertiert... die letzte zeile hat dann weniger zeichen in der zeile...
Moderiert von
Motzi: Code- durch Delphi-Tags ersetzt.
FaTaLGuiLLoTiNe - Mo 24.05.04 14:58
Also für eine Begründung sollen jetzt mal die etwas fitteren Delphianer sorgen, aber bei mir funktioniert das Ganze sobald ich hinter dem letzten
WriteLn(F2, Textzeile) ein
CloseFile(F2) einfüge (was man sowieso machen sollte wenn man eine Datei fertig bearbeitet hat). Wahrscheinlich hat es irgendwas hiermit zu tun:
Delphi Hilfe hat folgendes geschrieben: |
Die F zugeordnete externe Datei wird vollständig aktualisiert und anschließend geschlossen, wodurch das Datei-Handle für die erneute Verwendung freigegeben wird.
|
Hoffe das hilft.
kostenix - Mo 24.05.04 15:09
ja super!
das hat geholfen!
danke schön! darauf wär ich nie gekommen!!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!