Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wieder E/A-Fehler...aber ich finde ihn nicht (https://www.delphipraxis.net/73352-wieder-e-fehler-aber-ich-finde-ihn-nicht.html)

Kasch 16. Jul 2006 16:12


Wieder E/A-Fehler...aber ich finde ihn nicht
 
Hallo Leute,

sollte eigentlich recht einfach sein, aber scheinbar doch nicht:

Delphi-Quellcode:
procedure TForm1.btn_ladeClick(Sender: TObject);
var

    daten1: array[1..100] of string;
    s: string [64];
    datei: textfile;

begin
  AssignFile(datei,'e:\aaa.txt');
    Reset(datei);

  if IOResult <> 0 then begin // Fehler beim Öffnen
      Rewrite(datei); // Erzeuge Datei
      if IOResult <> 0 then begin
        ShowMessage('Datei konnte nicht angelegt werden');
        exit;
      end;
    end;

for y:=1 to 100 do
  begin
   daten1[y]:=inttostr(y); //Fülle das Array einfach sinnlos mit einem String
   s:= daten1[y];         // Sicher ist sicher, ein einfacher Pufferstring nimmt den Array-String auf
   writeln(datei,s);      // Hier steigt er aus
  end;

 closefile(datei);

end;
Es bricht sofort nach dem Drücken ab, mit Fehlermeldung E/A 103, obwohl ich einen Abfangzweig mit Message eingebaut habe, wird es ignoriert... was kann das sein? Bin extremst ratlos, weil im Forum ja alle Beispiele ähnlich sind..

Hawkeye219 16. Jul 2006 16:20

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Hallo Kasch,

du öffnest eine Datei mit Reset zum Lesen und möchtest etwas hineinschreiben? Das kann nicht funktionieren.

Gruß Hawkeye

Kasch 16. Jul 2006 16:38

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
dafür war eigentlich die nachfolgende IO-result-anweisung gedacht...

aber selbst wenn ich reset durch rewrite ersetze, klappt es nicht. Oder ist rewrite nicht der richtige Befehl?

fkerber 16. Jul 2006 16:40

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Hi!

Bis zu welcher Stelle kommst du denn beim Ausführen?


Ciao Frederic

Kasch 16. Jul 2006 17:22

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Delphi-Quellcode:
 writeln(datei,s);      // Hier steigt er aus
das steht zumindest der Cursor nach dem Abbruch

mkinzler 16. Jul 2006 17:24

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Handelt es sich um eine TextFile?

Kasch 16. Jul 2006 17:42

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Delphi-Quellcode:
 datei: textfile;
wenn du das meinst ja - oder was meinst du? Habe 'datei' als textfile deklariert.
So wie ich es eigentlich hier an einigen Beispielen gesehen habe.

turboPASCAL 16. Jul 2006 17:47

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Was kommt denn für ein Fehler E/A 105 ...?

Mach doch mal
Delphi-Quellcode:
{$I-}
reset(f);
{$I+}
...

Kasch 16. Jul 2006 17:52

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
habe ich gerade probiert,allerdings mit rewrite *g
geht auch nicht...Fehlercode 103....und immer beim writeln bleibt erhängen..
achso, Festplatte hat noch Platz, habe ich auch schon überprüft

edit: habe bissel probiert

Delphi-Quellcode:
{$I-} 
reset(f);
{$I+} 
...
kommt E/A 1005

Delphi-Quellcode:
{$I-} 
rewrite(f);
{$I+} 
...
kommt E/A 103

Was ist das nur?

Sharky 16. Jul 2006 17:55

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Also bei mir geht der Code (mit der Erweiterung von Matti) ohne Probleme.

dataspider 16. Jul 2006 17:56

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Zitat:

Zitat von Kasch
habe ich gerade probiert,allerdings mit rewrite *g
geht auch nicht...Fehlercode 103....und immer beim writeln bleibt erhängen..
achso, Festplatte hat noch Platz, habe ich auch schon überprüft

Hi,

setz doch mal den Vorschlag von turboPASCAL um.
Wenn du mit IOResult und nicht mit Exception arbeitest, muss der Compilerschalter {$I-} gesetzt werden.

Dann solltest du evtll. mal den FileMode prüfen:
Delphi-Quellcode:
if FileMode <> fmOpenReadWrite then
  MessageDlg('Achtung, FileMode setzen', mtWarning, [mbOK], 0);
und wenn es dann noch nicht geht, hast du vielleicht keine Schreibrechte auf E?

Cu, Frank

[EDIT]
Und evtll. statt Reset mal System.Reset - manchmal werden in anderen Units gleichlautende Funktionen definiert...

turboPASCAL 16. Jul 2006 18:15

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Was der Fehler ist ist:

Zitat:

Warnung: Wenn Sie Reset für eine schreibgeschützte Datei aufrufen, müssen Sie zuvor FileMode zurücksetzen. Auch wenn die Datei nur gelesen werden soll, verursacht der Standardwert von FileMode (Schreib-/Lesezugriff), daß das Öffnen einer schreibgeschützten Datei fehlschlägt.
und:

Zitat:

Bei einer Textdatei ist F nach dem Öffnen schreibgeschützt.

Nach dem Aufruf von Reset hat Eof(F) den Wert True, wenn die Datei leer ist. Andernfalls ist Eof(F) False.
F1

turboPASCAL 16. Jul 2006 18:31

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Aslo zur Erleuterung:

Delphi-Quellcode:
var
  f: TextFile;
  daten1: array[1..100] of string;
  s: string;
  i, err: Integer;


function ShowEAErrors(Error: Integer): string;
begin
  case Error of
    100: Result := 'Fehler beim Lesen vom Datenträger';
    101: Result := 'Fehler beim Schreiben auf Datenträger';
    102: Result := 'Dateivariable ist keiner Datei zugewiesen';
    103: Result := 'Datei nicht geöffnet';
    104: Result := 'Datei wurde nicht für Leseoperationen geöffnet';
    105: Result := 'Datei wurde nicht für Schreiboperationen geöffnet';
    106: Result := 'Ungültiges numerisches Format';
    else Result := 'Nicht dokumentierter Fehler';
  end;
end;


procedure SaveFile;
begin
  err := 0;

  AssignFile(f, 'c:\aaa.txt');
  {$I-}
  Rewrite(f); // Erzeuge Datei neu !
  {$I+}
  err := IOResult;

  if err = 0 then // Wenn kein Fehler vorhanden dann Daten schreiben
  begin

    for i:=1 to 100 do
    begin
      daten1[i] := inttostr(i); //Fülle das Array einfach sinnlos mit einem String
      {$I-}
      writeln(f, daten1[i]); // Daten schreiben
      {$I+}
      err := IOResult;
      if err <> 0 then
      begin
        ShowMessage(ShowEAErrors(err));
        break;
      end;
    end;

  end else
    ShowMessage(ShowEAErrors(err));

  CloseFile(f);
end;

procedure OpenFile;
begin
  err := 0;

  AssignFile(f, 'c:\aaa.txt');
  {$I-}
  Reset(f); // Datei nur zum lesen öffnen !
  {$I+}
  err := IOResult;

  if err = 0 then // Wenn kein Fehler vorhanden dann Daten schreiben
  begin

    for i:=1 to 100 do
      readln(f, daten1[i]); // Daten in Array lesen

  end else
    ShowMessage(ShowEAErrors(err));

  CloseFile(f);
end;

procedure AppendFile;
begin
  err := 0;

  AssignFile(f, 'c:\aaa.txt');
  {$I-}
  Append(f); // Datei zum anhängen von Daten öffnen
              //(geht nur wenn Datei vorhanden)
  {$I+}
  err := IOResult;

  if err = 0 then // Wenn kein Fehler vorhanden dann Daten anhängen
  begin

    for i:=1 to 100 do
    begin
      daten1[i] := ...
      Writeln(f, daten1[i]); // Daten an vorh. Daten anhängen / schreiben
    end;

  end else
    ShowMessage(ShowEAErrors(err));

  CloseFile(f);
end;

turboPASCAL 16. Jul 2006 18:39

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Aslo heisst das in Deinem Fall dass das dann so aus sehen sollte:

Delphi-Quellcode:
var
  f: Textfile;
  daten1: array[1..100] of string;
  s: string;
  i, err: Integer;


function ShowEAErrors(Error: Integer): string;
begin
  case Error of
    100: Result := 'Fehler beim Lesen vom Datenträger';
    101: Result := 'Fehler beim Schreiben auf Datenträger';
    102: Result := 'Dateivariable ist keiner Datei zugewiesen';
    103: Result := 'Datei nicht geöffnet';
    104: Result := 'Datei wurde nicht für Leseoperationen geöffnet';
    105: Result := 'Datei wurde nicht für Schreiboperationen geöffnet';
    106: Result := 'Ungültiges numerisches Format';
    else Result := 'Nicht dokumentierter Fehler';
  end;
end;

procedure So_und_so;
begin
  err := 0; // braucht man eigentlich nich machen
            // da IOresult den Wert setzt...

  AssignFile(f, 'c:\aaa.txt');
  {$I-}
  Append(f); // Öffne Datei zum anhangen von Text
  {$I+}
  err := IOResult;

  if err <> 0 then // Wenn keine Datei da dann neu erstellen
  begin
    {$I-}
    Rewrite(f); // Erstelle Datei neu (Schreibrechte)
    {$I+}
    err := IOResult;
  end;

  if err = 0 then // Keine Fehler ? dann los
  begin

     for i:=1 to 100 do
     begin
       daten1[i] := inttostr(i); //Fülle das Array einfach sinnlos mit einem String
       writeln(f, daten1[i]); // Daten schreiben
     end;

  end else // Fehler !? Was für einer ?
    ShowMessage(ShowEAErrors(err));

  CloseFile(f); // Datei schliessen
end;
// Edit: PS.: Ist das jetzt ein Tut ? :mrgreen:

Kasch 16. Jul 2006 18:43

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
also Schreibrechte habe ich, Datei wird ja erstellt. Es steht auch eine '1' drin, also wird die Schleife einmal durchlaufen und dann bricht er ab.

den Vorschlag von turbopascal habe ich durchgeführt. entweder 103(reset) oder 105(rewrite). siehe weiter oben mein edit.

Bin etwas ratlos, denn normalerweise müßte es ja auch gehen und langsam habe ich auch die Faxen dicke.
Kann doch nicht sein, daß es da Fehlermeldung gibt wenn es nicht sein kann!
Die Beispiele im Forum gehen ja schließlich auch. Und irgendwie ist es ja wohl total unlogisch, daß die Datei erstellt wird,
geöffnet und nur einmal beschrieben wird.

Der Virenscanner schlägt auch nicht an und auf der Festplatte sind 1GB frei.


Wer hat Vorschläge, wie ich es machen könnte?
-Datei erstellen
-Öffnen zum beschreiben/überschreiben
-in einer Schleife Strings schreiben
- Datei schließen

Vielen Dank schon mal.

Kasch 16. Jul 2006 18:46

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
mit append wird die datei ebenfalls geöffnet und um eine '1' erweitert- also wird die schreibsequenz wieder einmal ausgeführt und dann abgebrochen. Ich formartiere das hier gleich neu.....

Also, Datei wird eröffnet und einmal beschrieben - was nun?

turboPASCAL 16. Jul 2006 18:48

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Was willst denn Du überhaubt machen ?

Kasch 16. Jul 2006 18:52

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Habe ich doch geschrieben und dürfte doch auch aus meinem Quelltext erkenntlich sein...

-Datei erstellen
-Öffnen zum beschreiben/überschreiben
-in einer Schleife Strings schreiben
- Datei schließen

turboPASCAL 16. Jul 2006 18:56

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Hab ich doch alles beschrieben, Reset öffnet nur zum lesen, rewrite öffnet zum erstellen und überschreiben un append fügt Text an.

Anders geht es mit Writeln/Readeln nicht in Textdateien.

Kasch 16. Jul 2006 19:05

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
irgendwie habe ich den Eindruck, hier liest keiner was ich schreibe.

"mit append wird die datei ebenfalls geöffnet und um eine '1' erweitert- also wird die schreibsequenz wieder einmal ausgeführt und dann abgebrochen. Ich formartiere das hier gleich neu.....

Also, Datei wird eröffnet und einmal beschrieben - was nun? "

also klappt das Erstellen, Öffnen und Beschreiben. Nur nach einem Schreibvorgang kommt die Fehlermeldung und das Programm bricht ab. An was kann das Liegen?

turboPASCAL 16. Jul 2006 19:08

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Dann zeig doch bitte mal den akt. Code.

Kasch 16. Jul 2006 19:18

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
hat sich zum anfangspost nicht geändert

Delphi-Quellcode:
procedure TForm1.btn_ladeClick(Sender: TObject);
var

    daten1: array[1..100] of string;
    s: string [64];
    datei: textfile;

begin
  AssignFile(datei,'e:\aaa.txt');
   Reset(datei);

 

for y:=1 to 100 do
  begin
   daten1[y]:=inttostr(y); //Fülle das Array einfach sinnlos mit einem String
   s:= daten1[y];         // Sicher ist sicher, ein einfacher Pufferstring nimmt den Array-String auf
   writeln(datei,s);      // Hier steigt er nach einem Durchlauf aus
  end;

closefile(datei);

end;

turboPASCAL 16. Jul 2006 19:32

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Zitat:

Zitat von Kasch
hat sich zum anfangspost nicht geändert

Zitat:

Zitat von Kasch
Code:
procedure TForm1.btn_ladeClick(Sender: TObject);
var

    daten1: array[1..100] of string;
    s: string [64];
    datei: textfile;

begin
  AssignFile(datei,'e:\aaa.txt');

 // Öffnet die Datei nur zum lesen !!!!!!! (Textdatei)
 [b] Reset(datei); [/b]
 

for y:=1 to 100 do
  begin
   daten1[y]:=inttostr(y); //Fülle das Array einfach sinnlos mit einem String
   s:= daten1[y];         // Sicher ist sicher, ein einfacher Pufferstring nimmt den Array-String auf
   writeln(datei,s);      // Hier steigt er nach einem Durchlauf aus
  end;

closefile(datei);

end;

Warum auch ?

Post #14, #13, #12 ? :gruebel:

Kasch 16. Jul 2006 19:48

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
fehler gefunden,

in dem wust hatte sich doch tatsache closefile(datei) noch in die schleife reingeschmuggelt.
viel Lärm um nichts und die Erkenntnis, nächstes mal den Quellcode besser zu ordnen.
Vielen Dank an alle.

mkinzler 16. Jul 2006 19:53

Re: Wieder E/A-Fehler...aber ich finde ihn nicht
 
Du hast dafür aber die Antworten nicht gelesen. denn beim ersten mals klappt es, weil die datei nicht existiert. beim 2. Durchlauf existiert diese und wird ja mit reset geöffnet ( nur zum Lesen) und dann wird versucht zu Schreiben.!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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