Entwickler-Ecke

Dateizugriff - Delphi schreibt nicht in die Textdatei!


IronBull - Mo 23.11.09 16:37
Titel: Delphi schreibt nicht in die Textdatei!
Hallo Leute, ich habe ein Programm geschrieben in dem eine beliebig einlesebare Textdatei mit Inhalt mit dem Viginereverfahren verschluesselt wird. Das Problem liegt nun darin, dass nichts in die Datei geschrieben wird. Am Besten ist wenn ihr den Code direkt testet und über den Debugger seht was schieft läuft. Leider finde ich nichts.


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:
unit vig;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TTextDatei = file of char;
  TForm1 = class(TForm)
    Button1: TButton;
    Edit2: TEdit;
    Label3: TLabel;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Edit1Enter(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  nachricht: TTextDatei;
  verschluesselt:TTextDatei;

implementation

{$R *.dfm}
{*************Verschlüsselung********************}

function viginere(text:string; key:string):string;
 var i,tmp:integer;
     resulttmp:string;
 begin
 resulttmp:='';
 rewrite(verschluesselt);
 i:=1;
while not EOF(nachricht) do
  begin
     tmp:=ord(key[1+(i-1mod length(key)]);
     resulttmp:=resulttmp+char((ord(text[i])+tmp) mod 255);
     write(verschluesselt, resulttmp[i]);
     inc(i);
  end;
  
 close(verschluesselt);
 result:=resulttmp;
 end;

{*************Einlesen****************************}
function Einlesen():string;
var ch:char;
begin
 reset(nachricht);
 result:='';
 while not EOF(nachricht) do
  begin
   Read(nachricht, ch);
   result:=result + ch;
  end;

end;

{*************Datei öffnen*************************}
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenDialog1.Execute;
Edit1.Text:=OpenDialog1.FileName;
assignfile(nachricht, OpenDialog1.FileName);
Memo1.Lines.Add(Einlesen());
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
assignfile(nachricht, Edit1.Text);
end;

{*************Ausgabe*******************************}
procedure TForm1.Button1Click(Sender: TObject);
begin

if Edit2.Text <> '' then
 begin
   Memo2.Lines.Add(viginere(Einlesen(), Edit2.Text));
  end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 assignfile(verschluesselt, 'kodiert.txt');
end;

end.


Hoffe ihr findet den Fehler, ich habe schon fast Kopfweg :D

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 23.11.2009 um 16:31


Nersgatt - Mo 23.11.09 16:54

Zeig mir mal bitte die Stelle in Deinem Quellcode, an der Du erwartet, dass in eine Datei geschrieben wird.


thepaine91 - Mo 23.11.09 17:17

Hi,

1.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  Form1: TForm1;
  nachricht: TTextDatei;  // hat hier nichts zu suchen!
  verschluesselt:TTextDatei;  // hat hier nichts zu suchen!

  private
    { Private declarations } // die sind schon ganz einsam
  public
    { Public declarations }


Muck - Mo 23.11.09 19:54

Hallo,

Deine Function Einlesen endet mit eof(nachricht)

Dann in der Function viginere fragst Du immer noch nach EOF(nachricht).

Nun die Eingabedatei ist bereits EOF zu diesem Zeitpunkt.

Am besten beide Proceduren zu einer vereinen, also lesen und schreiben in einer Procedure.

Markus


ffgorcky - Sa 28.11.09 22:43

Also wenn ich das gerade richtig sehe, dann liegt hier der Fehler:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
{*************Einlesen****************************}
function Einlesen():string;
var ch:char;
begin
 reset(nachricht);
 result:='';
 while not EOF(nachricht) do
  begin
   Read(nachricht, ch);
   result:=result + ch;
  end;

end;

Weil Du der result-Variable nur einmal einen Wert zuweisen kannst und damit hört die Funktion dann auf.
Ich würde das ganze daher eher so schreiben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
{*************Einlesen****************************}
function Einlesen():string;
var ch:char;
    rueckgabeString:String;
begin
 reset(nachricht);
 rueckgabeString:='';
 while not EOF(nachricht) do
  begin
   Read(nachricht, ch);
   rueckgabeString:=rueckgabeString + ch;
  end;
result:=rueckgabeString;
end;

So, ich hoffe, das ich Dir damit jetzt keinen Blödsinn erzähle, weil ich das im Moment nicht nachprüfen kann...


elundril - Sa 28.11.09 22:46

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:

Weil Du der result-Variable nur einmal einen Wert zuweisen kannst und damit hört die Funktion dann auf.
{..}So, ich hoffe, das ich Dir damit jetzt keinen Blödsinn erzähle, weil ich das im Moment nicht nachprüfen kann...


tust du leider. in delphi kann man result öfter zuweisen. erst am ende der function wird zurückgesprungen. ich glaub du verwechselst etwas c#/java mit delphi, kann das sein?

lg elundril


ffgorcky - Sa 28.11.09 22:55

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
ich glaub du verwechselst etwas c#/java mit delphi, kann das sein?

Ja, das kann gut sein, da ich ja Delphi in der Schule gehabt habe (wo ich auf den Programmier-Geschmack gekommen bin) und danach dann in der Ausbildung C#.NET (und in der Berufsschule Java), welche ich aber durch meinen Motorradunfall vor etwa 3 ½ Jahren (also mitte 2006 - unachtsam linksabbiegender Gegenverkehr) wieder vergessen habe.
Es spuken nur ab und an dann doch mal solch ein paar Gedanken dazu in meinem Kopf rum, wie ja z.B. auch gerade hier - nur ist es halt blöd, wenn sie mich dann durcheinanderbringen.
In Delphi habe ich mich ja sonst denke ich schon wieder recht gut eingelebt.


elundril - Sa 28.11.09 23:01

jo, najo, macht ja nix. der compiler schreit ja meistens eh. ;) und is natürlich auch dann ne sache von training und routine. das wird schon wieder.

lg elundril