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 user profile iconPeter 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 <> #13and (ch <> #10)
        then str:= str + ch
      else
        if (ch = #13then
        begin
          inc(i);
          if (i <> LineNum + 1then str := '';
        end;
    until (i = LineNum + 1Or 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            //Anfang des Programmss

if (ParamStr(1) = '?'OR (ParamStr(1) = 'help'then
   Writeln('konvert.exe vorhandene_datei neue_datei')
else if (ParamCount < 2OR (ParamCount > 2then
   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...');

//--------------- erste Zeile ---------------
    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 dazwischen ---------------
  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;

//------------------ letzte Zeile ------------------
  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);
//------------------ letzte Zeile ------------------
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 user profile iconMotzi: 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!!!