Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler bei write / writeln in eine Datei (https://www.delphipraxis.net/59621-fehler-bei-write-writeln-eine-datei.html)

Chrissi91 26. Dez 2005 08:12


Fehler bei write / writeln in eine Datei
 
Meine Procedure:

Delphi-Quellcode:
procedure DateiUeberschreiben(pfad: string; groesse: integer);
var
 i, a, zufall: integer;
 zeichen: string;
begin
 for a:= 1 to 10 do
  begin
   assign(datei,pfad);
   rewrite(datei);
   for i:= 1 to groesse do
    begin
     zufall:=random(15)+1;
     if zufall= 1 then zeichen:='@';
     if zufall= 2 then zeichen:='t';
     if zufall= 3 then zeichen:='ö';
     if zufall= 4 then zeichen:='+';
     if zufall= 5 then zeichen:='~';
     if zufall= 6 then zeichen:='*';
     if zufall= 7 then zeichen:='#';
     if zufall= 8 then zeichen:='w';
     if zufall= 9 then zeichen:='d';
     if zufall= 10 then zeichen:='b';
     if zufall= 11 then zeichen:=' ';
     if zufall= 12 then zeichen:=']';
     if zufall= 13 then zeichen:='3';
     if zufall= 14 then zeichen:='|';
     if zufall= 15 then zeichen:='2';
     write(datei,zeichen); // Fehlermeldung [Error] Unit1.pas(58): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'String'
// wenn ich das nehme: writeln(datei,zeichen); kommt das: [Error] Unit1.pas(58): Illegal type in Write/Writeln statement
    end;
   closefile(datei);
  end;
 deletefile(form1.verzeichnis.text);
end;
Die rufe ich wie folgt auf:

Delphi-Quellcode:
procedure TForm1.loeschenClick(Sender: TObject);
begin
 assignfile(datei,verzeichnis.text);
 reset(datei);
 dateiUeberschreiben(verzeichnis.text,filesize(datei));
 closefile(datei);
end;
Was mache ich falsch?

Daniel B 26. Dez 2005 08:23

Re: Fehler bei write / writeln in eine Datei
 
1. write(datei,zeichen);, zeichen ist vom Typ String, musst du in PChar umwandeln.
2. assignfile(datei,verzeichnis.text);, sicher das es .text und nicht .txt heisst?

Chrissi91 26. Dez 2005 08:25

Re: Fehler bei write / writeln in eine Datei
 
Verzeichnis ist vom Typ TEdit. der Pfad im Edit namens Verzeichnis stammt aus einem opendialog. :)

danke. aber wie wandel ich char in string? chartostr ... muss ich mal teten ^^

Daniel B 26. Dez 2005 08:27

Re: Fehler bei write / writeln in eine Datei
 
Dann gib doch dem Edit nen Namen womit man den auch erkennen kann... :roll:

PChar(zeichen);

PierreB 26. Dez 2005 08:27

Re: Fehler bei write / writeln in eine Datei
 
Zitat:

danke. aber wie wandel ich char in string? chartostr ... muss ich mal teten ^^
Delphi-Quellcode:
PChar('string');

GuenterS 26. Dez 2005 08:43

Re: Fehler bei write / writeln in eine Datei
 
1.
Du brauchst deinen String nicht in einen PChar verwandeln, da write sehr wohl auch Shortstring und String akzeptiert.

2.
In deiner Procedure "DateiUeberschreiben", schreibst Du "assign(datei,pfad);" Was soll das denn bringen?

Wäre AssignFile(datei, Pfad) nicht zielführender?

3.
In deiner Loeschen Procedure solltest Du bevor due die Ueberschreiben Procedure aufrufst, CloseFile aufrufen und die davor dir die Größe der Datei in einer Variablen speichern.

Sharky 26. Dez 2005 08:47

Re: Fehler bei write / writeln in eine Datei
 
Hai Christopher,

mal unabhängig von deinem Problem. Was hälst Du denn von diesem Ansatz um deine ganzen IF-Then Abfragen zu verhindern?
Delphi-Quellcode:
procedure DateiUeberschreiben(pfad: string; groesse: integer);
const
  myChars: array[1..15] of Char =
    ('@', 't', 'ö', '+', '~', '*', '#', 'w', 'd', 'b', ' ',
    ']', '3', '|', '2');
var
  i, a : integer;
  zeichen: Char;
begin
  for a := 1 to 10 do
  begin
    Assign(datei, pfad);
    rewrite(datei);
    for i := 1 to groesse do
    begin
      zeichen := myChars[random(15) + 1];
      .
      .
      .

marabu 26. Dez 2005 09:15

Re: Fehler bei write / writeln in eine Datei
 
Hallo Christopher,

Delphi-Quellcode:
var
  datei: TextFile;
wahrscheinlich hast du datei mit dem Typ file deklariert.

Weihnachtsgrüße vom marabu

Chrissi91 26. Dez 2005 09:39

Re: Fehler bei write / writeln in eine Datei
 
Zitat:

Zitat von marabu
Hallo Christopher,

Delphi-Quellcode:
var
  datei: TextFile;
wahrscheinlich hast du datei mit dem Typ file deklariert.

Weihnachtsgrüße vom marabu

Nein, ich bae

datei: file ;)

Alle anderen Vorschläge nehme ich gerne an. Ich wollte ja erstmal ganz simpel versuchen, eraser (dateien komplett löschen, dass man sie nicht mehr wiederfinden kann :)) nachzuproggen. das war erstmal ein kleiner ansatz. falls ihr für mein programm ein paar ideen habt, könnt ihr ja sie gerne posten. Nich tdenken, dass das gleich in die freeware sparte kommt ^^, denn ich denke, mit meiner methode lassen sich trotzdem dateien wiederfinden. :xmas:

Muetze1 26. Dez 2005 10:28

Re: Fehler bei write / writeln in eine Datei
 
Zitat:

Zitat von Chrissi91
Zitat:

Zitat von marabu
Hallo Christopher,

Delphi-Quellcode:
var
  datei: TextFile;
wahrscheinlich hast du datei mit dem Typ file deklariert.

Weihnachtsgrüße vom marabu

Nein, ich bae

datei: file ;)

Doch, also hast du doch. ReadLn() und WriteLn() kannst du nur auf Textdateien anwenden und daher will er datei vom Typ TextFile haben - wie marabu schon richtig sagte. Und Write() sowie Read() wollen bei einem untypirisierten Dateitype (File) binärdaten, Strukturen etc haben und keine Strings. Ändere den Typ von Datei und es wird damit schonmal klappen.

Marabu hat genau das richtige genannt - genauer lesen...

GuenterS 26. Dez 2005 11:49

Re: Fehler bei write / writeln in eine Datei
 
Du könntest ja auch File of byte bzw. file of char verwenden und deine Variable zeichen zu einem char machen.

Für den Hausgebrauch sollte dieses Verfahren um Dateien zu schreddern ausreichend sein, denk ich. Wirklich pyshikalisch schreddern wie in Presse oder so kann man per Prog eh nicht realisieren.

Chrissi91 27. Dez 2005 08:02

Re: Fehler bei write / writeln in eine Datei
 
Delphi-Quellcode:
procedure DateiUeberschreiben(pfad: string; groesse: integer);
const
 mychar :string = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"§$%&/()=?~+,.-{}[]²³\|*');
var
 i, a : integer;
 zeichen: Char;
 datei: file of char;
begin
 for a := 1 to 10 do
  begin
   Assign(datei, pfad);
   rewrite(datei);
   for i := 1 to groesse do
    begin
     zeichen := copy(PChar(mychar),random(10)+1,1); // [Error] Unit1.pas(44): Incompatible types: 'Char' and 'String'
     write(datei,zeichen);
    end;
   closefile(datei);
  end;
 deletefile(form1.verzeichnis.text);
end;
Jetzt meckert er wieder egen dem Charakter, dabei habe ich doch jetzt darum PChar() gesetzt.

fkerber 27. Dez 2005 08:07

Re: Fehler bei write / writeln in eine Datei
 
Hi!

Sollte assign nicht immer noch assignFile heißen?
Lass das PChar mal weg.


Ciao Frederic

Chrissi91 27. Dez 2005 08:09

Re: Fehler bei write / writeln in eine Datei
 
Zitat:

Zitat von fkerber
Hi!

Sollte assign nicht immer noch assignFile heißen?
Lass das PChar mal weg.


Ciao Frederic

datei ist vom Typ File of Char. Ich denke, da brauche ich assign, oder habe ich das missverstanden? Wenn ich PChar weglasse, kommt die selbe Fehlermeldung.

GuenterS 27. Dez 2005 08:12

Re: Fehler bei write / writeln in eine Datei
 
Nein, Assign ist für andere Zwecke gedacht, Du kannst/solltest trotzdem AssignFile verwenden.

Wegen dem anderen Problem, mach aus deinem String einen ShortString, er ist ja nicht länger als 255 Zeichen und greif via [] auf die einzelnen Zeichen zu. das sollte funktionieren.

Chrissi91 27. Dez 2005 08:15

Re: Fehler bei write / writeln in eine Datei
 
Ist wohl noch einnbisschen früh für mich :drunken:

Delphi-Quellcode:
procedure DateiUeberschreiben(pfad: string; groesse: integer);
const
 mychar :shortstring = ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"§$%&/()=?~+,.-{}[]²³\|*');
var
 i, a : integer;
 zeichen: Char;
 datei: file of char;
begin
 for a := 1 to 10 do
  begin
   Assignfile(datei, pfad);
   rewrite(datei);
   for i := 1 to groesse do
    begin
     zeichen := copy(mychar[random(10)+1]),i,1); // not enough parameters. was mache ich denn jetzt wieder flasch :stupid:
     write(datei,zeichen);
    end;
   closefile(datei);
  end;
 deletefile(form1.verzeichnis.text);
end;

fkerber 27. Dez 2005 08:18

Re: Fehler bei write / writeln in eine Datei
 
HI!

Wenn ich nur Assign verwende kommt bei mir dieser Fehler:
[Error] Unit1.pas(38): Incompatible types: 'TPersistent' and 'Text'

Also: AssignFile verwenden


Zum Char-Problem:
zeichen erwartet einen Char, copy liefert einen String der Länge 1 zurück
==> nur auf erstes Zeichen zugreifen:

Delphi-Quellcode:
zeichen := copy(mychar,random(10)+1,1)[1];

Ciao Frederic

GuenterS 27. Dez 2005 08:19

Re: Fehler bei write / writeln in eine Datei
 
Fkerbers Idee ist gut,

was ich gemeint habe wäre

Delphi-Quellcode:
zeichen := mychar[random(10)+1];
gewesen.

fkerber 27. Dez 2005 08:28

Re: Fehler bei write / writeln in eine Datei
 
Hi!

Falls du die Idee von GuenterS aufgreifen willst, musst du nur die falsche ) an der Stelle da weglassen:

Delphi-Quellcode:
(mychar[random(10)+1]),i,1);
                     ^^

Ciao Frederic

Chrissi91 27. Dez 2005 08:31

Re: Fehler bei write / writeln in eine Datei
 
Danke, ich hab es jetzt richtig. :coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz