![]() |
I/O-Fehler-998
ich will n record speichern und laden
jetzt hat mein chef gesagt mit blockread/write geht das gut hab hier gesucht und wie immer was passendes gefunden :) aber jetzt krieg ich einen fehler "I/O-Fehler-998" also IN ount fehler irgendwas mit dem lesen/schreibe nder datei aber fehler code 998 finde ich nirgendwo ich hoffe ihr könnt mir mit dem quellcode helfen hier issa
Delphi-Quellcode:
type
Vert_Ent = record vtjahr : Integer; vtproz : array [0..11] of Integer; end; Steuer = record st_bez : string[30]; st_jahr : array [0..11] of Integer; st_vert : string[10]; st_aufk : array [0..11] of longint; end; Modell = record und_bez : string[30]; und_st : array [0..31] of Steuer; end; TAlles= record Vert_ast : array [0..30] of array [0..22] of string[30] ; vert_datum : array [0..31] of Vert_ent; mod_ : array [0..15] of Modell; end; var Form1: TForm1; Alles : TAlles; implementation {$R *.DFM} procedure TForm1.SaveClick(Sender: TObject); var FaDatei: file of Talles; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; result : word; begin if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); { Ausgabedatei öffnen } Rewrite(FaDatei); { Datensatzgröße = 1 } repeat BlockWrite(FaDatei, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FaDatei); end; //EInOutError end; mach ich generell was falsch? glg Nico |
Re: I/O-Fehler-998
ich würde an deiner Stelle generell auf FileStream umsteigen und die relikte aus alten (nicht objektorientierten) Zeiten ruhen lassen.
An welcher Stelle genau (Codezeile) fliegt dir der Fehler um die Ohren? |
Re: I/O-Fehler-998
naja mein chef will auch dass ich c statt c++ lern weil man damit mehr möglichkeiten hat :(
ich bin echt ratlos in der sache sonst bräucht ich eure hilfe nicht - er wills halt nun mal so haben da hilft kein erklären ;D lg nico |
Re: I/O-Fehler-998
die frage in welcher zeile der fehler kommt bleibt :-) Und wenn du ihm einfach die Lösung mit TFileStream präsentierst wird er sicher nicht sagen: "Das funktioniert zwar aber bitte mach es anders und investiere noch ein paar Stunden"
|
Re: I/O-Fehler-998
nein aber er wills so klein wie möglich haben und ach ich weiß nicht was ich machen soll was das angeht ich bin eh schon sehr genervt weil ich ihm das ganze schon einmal vorgelegt hab er wills nunmal so ich soll jetzt auch über den ferialjob hinweg(den ich auch bei ihm mache) c lernen weil dass das einzig wahre ist mit dem man alles machen kann und viel mehr als mit den heutigen programmiersprachen
er nennt den wirth auch immer einen "koffer" weil viel zu viel vorgegeben ist (auf verweis dass es ehemals eine lernsprache für studierende war), dass steuerzeichen im string enthalten sind und zuviel datenmüll gespeichert wird. der fehler tritt beim drücken auf den speicher knopf auf wenn ich debugge bei
Delphi-Quellcode:
BlockWrite(FaDatei, Buf, NumRead, NumWritten);
lg nico |
Re: I/O-Fehler-998
alte Relikte?
Dieses sind nur direkte Weiterleitungen zur WinAPI. TFileStream ist eine viel zu groß aufgeblasene Klasse, welche eigenlich das Selbe macht. ich find die ganze SaveClick-Prozedure eigenartig. Da wird 'ne Datei zu Schreiben geöffnet, und dann unter Umständen (NumRead zufällt = SizeOf(Buf)) ununterbrochen da reingeschrieben. Was wird da überhaupt gespeichert? > BlockWrite(FaDatei, Buf, NumRead, NumWritten); in Buf wurde ja nichts reingeladen was ist mir NumRead (völlig undeffinierter inhalt) > until (NumRead = 0) or (NumWritten <> NumRead); > Buf: Talles; wäre schonmal schön Der Fehler 998 ... könnte der beim Aufruf von BlockWrite auftauchen? vermutlich weil SizeOf(Talles) <> SizeOf(Buf) [edit] "der fehler tritt beim drücken auf den speicher knopf auf wenn ich debugge bei" hab'sch doch richtig vermutet :mrgreen: [/edit] > { Datensatzgröße = 1 } wohl eher { Datensatzgröße = SizeOf(Talles) } .... |
Re: I/O-Fehler-998
leider hat mir das jetzt überhaupt nix gebracht :( hab das buf : talles gemacht sattt of array of char aber nix geholfen gleicher fehler
ja ich weiß dass fehlerdrinnen sind weil ich mit dem ganzen zeugs noch nie gearbeitet habe und einfach vermutet habe mit der delphihilfe das beispiel genommen und zerlegt hab das save ding is nur mal zum vorbeugen nacher wird das im extractfilepath(paramstr(0)) + 'fafile.dat' gespeichert kanns vl sein dass ich zuerst n createfile machen muss? hier is das beispiel aus der delphi hilfe da wird in buf übrigens auch nix reingeschrieben
Delphi-Quellcode:
lg nico
var
FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; begin if OpenDialog1.Execute then { Dialog zum Dateiöffnen anzeigen } begin AssignFile(FromF, OpenDialog1.FileName); Reset(FromF, 1); { Datensatzgröße = 1 } if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(ToF, SaveDialog1.FileName); { Ausgabedatei öffnen } Rewrite(ToF, 1); { Datensatzgröße = 1 } Canvas.TextOut(10, 10, 'Kopieren von ' + IntToStr(FileSize(FromF)) + ' Byte...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; end; end; |
Re: I/O-Fehler-998
weiß vl wer wo man die fehlernr wenigstens nachschauen kann?
in der delphu hilfe is dieser nicht vermerkt lg nico |
Re: I/O-Fehler-998
Das CreateFile (WinAPI) versteckt sich im Rewrite/Reset/Append.
Im AssignFile wird eigentlich nichts gemacht, außer den Dateinamen in dem Delphi-Record, welcher sich in der File-Variable (FaDatei) versteckt. Im Rewrite/Reset/Append wird dann die Datei per CreateFile umd mit den da gewählten Rechten/Optionen geöffnet. Ich hab zwar auch schon seit Ewigkeiten nicht mehr mit diesen Dateifunktionen gearbeitet (mache vieles gern direkt über die WinAPI), aber ich kann ja dann daheim mal mit dem Code aus #1 ein Testproject aufmachen und da mal reinsehn was eventuell los ist ... es sei den du stellst mal irgendwie dein testprojet bereit damit man direkt an der Quelle nach 'nem Fehler suchen kann... |
Re: I/O-Fehler-998
Hallo,
der Fehler in Beitrag #1 ist doch offensichtlich: Die Logik aus dem Delphi-Beispiel wurde verstümmelt und der verbliebene Rest ist unbrauchbar. Lieber Nico, wenn du in der Online Hilfe mal unter BlockWrite nachliest, dann erkennst du bestimmt, dass NumRead bei dir initialisiert werden muss und vom Namen her nur im Original-Beispiel Sinn gemacht hat. Freundliche Grüße |
Re: I/O-Fehler-998
Liste der Anhänge anzeigen (Anzahl: 1)
ja gerne vielen dank
das ist nur ein tesprojekt wo ein record gefüllt wird mit über 11000 daten und die solln dann gespeichert werden(das record ist orginal aus dem programm übernommen dass ich für die firma entwickeln muss) ich hoffe du kansnt das comüilieren weils mit delphi 3 gecoded is nochmals danke für deine zeit lg nico edit ah zu schnell weitergegeklickt - marubu :wall: danke für den tipp ich gehs noch mal durch sry |
Re: I/O-Fehler-998
unabhängig vom vorig gesagten : marabu wie soll ich denn numread(name hin oder her) initialisieren? woher nehm ich den count?
lg nico |
Re: I/O-Fehler-998
Hast du denn gar nicht mal in die Hilfe geschaut? Der dritte Parameter von BlockWrite() gibt an, wieviele "Blöcke" geschrieben werden sollen. Im vierten Parameter wird die effektiv geschriebene Zahl zurück gemeldet, so dass du durch Vergleich feststellen kannst, ob alles nach deinen Wünschen verlaufen ist. Bei dir sollte der dritte Parameter wohl einfach 1 sein, oder?
BTW - Eine Block-Struktur (TAlles) mit etwa 94 KByte - etwas besseres ist deinem Chef nicht eingefallen? Die Struktur der Daten lässt sich gewiss intelligenter auf das Dateisystem abbilden als durch einen einzelnen Record. Nachdenkliche Grüße |
Re: I/O-Fehler-998
das mit dem vergleich hab ich schon verstanden danke - das mit der eins hab ich schon probiert leider nur mit dem erfolg dass jetzt der fehler
so lautet
Delphi-Quellcode:
---------------------------
Project1 --------------------------- I/O-Fehler 1784. --------------------------- OK --------------------------- :( wenn du vorschläge zum speichern hast - es geht ihm darum die datei so klein wie möglich zu halten(es geht heir um ca 12000 gepspeicherte zahlen und texte lg nico |
Re: I/O-Fehler-998
BlockRead ehthält ja in der Demo die größe der Daten, welche vorher gelesen und demnach geschrieben werden sollen.
dui mußt da angeben wieviel geschieben werden soll, also =SizeOf(TAlles) ? hier mal ein paar mögliche Codes:
Delphi-Quellcode:
var
FaDatei: file of TAlles; Buf: TAlles; if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Rewrite(FaDatei); { Ausgabedatei öffnen } BlockWrite(FaDatei, Buf, SizeOf(Buf)); CloseFile(FaDatei); end; if OpenDialog1.Execute then { Dialog zum Öffnen anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Reset(FaDatei); { Eingabedatei öffnen } BlockRead(FaDatei, Buf, SizeOf(Buf)); CloseFile(FaDatei); end;
Delphi-Quellcode:
var
FaDatei: file of TAlles; Buf: Array of TAlles; if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Rewrite(FaDatei); { Ausgabedatei öffnen } for i := 0 to High(Buf) do Write(FaDatei, Buf[i]); CloseFile(FaDatei); end; if OpenDialog1.Execute then { Dialog zum Öffnen anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Reset(FaDatei); { Eingabedatei öffnen } Buf := nil; while not Eof(FaDatei) do begin SetLength(Buf, Length(Buf) + 1); Read(FaDatei, Buf[High(Buf]]); end; CloseFile(FaDatei); end;
Delphi-Quellcode:
var
FaDatei: file of TAlles; Buf: TAlles; if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Rewrite(FaDatei); { Ausgabedatei öffnen } Write(FaDatei, Buf); CloseFile(FaDatei); end; if OpenDialog1.Execute then { Dialog zum Öffnen anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Reset(FaDatei); { Eingabedatei öffnen } Read(FaDatei, Buf); CloseFile(FaDatei); end;
Delphi-Quellcode:
Aber es wäre schon praktisch zu wissen welche Daten du genau gespeichert/gelesen haben möchtst.
var
FaDatei: file of TAlles; Buf: Array of TAlles; if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Rewrite(FaDatei); { Ausgabedatei öffnen } for i := 0 to High(Buf) do Write(FaDatei, Buf[i]); CloseFile(FaDatei); end; if OpenDialog1.Execute then { Dialog zum Öffnen anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Reset(FaDatei); { Eingabedatei öffnen } Buf := nil; while not Eof(FaDatei) do begin SetLength(Buf, Length(Buf) + 1); Read(FaDatei, Buf[High(Buf]]); end; CloseFile(FaDatei); end; Falls es nur TAlles ist, dann wären die Funktionen ohne Schleife für dich verwendbar. |
Re: I/O-Fehler-998
Liste der Anhänge anzeigen (Anzahl: 1)
hier mal so alle Möglichkeiten für dich
aber am Besten du führst das Programm nicht im Debugger aus ... wenn du nicht grade die Exceptionen dort abgeschaltet hast. |
Re: I/O-Fehler-998
wow :) vielen herzlichen dank du weißt gar nicht wie erleichter ich jetzt bin :)
ich geh die codes jetzt mal durch am späteren tag werd ich mich wieder melden nochmals - dankeschön gute nacht nico |
Re: I/O-Fehler-998
hab jetzt einfach mal dein programm ausgeführt
datei hat 0 byet und im memo wird Zitat:
aber ich geh mal den code durch lg nico :) edit juhu mit dem 2ten code funktioneirt auf jeden fall das speichern ich bin so glücklich :) vielen dank himitsu! gute nacht nico |
Re: I/O-Fehler-998
drum sagte ich ja ... nicht unbedingt im Debugger testen ... vorallem wenn der alle Exceptionen anzeigt :zwinker:
Tipp: nimm dir speziell den Code vor wo OK steht :stupid: Und jupp, da die Datei ja jedesmal neu erstellt und der letzte Aufruf fehlerhaft war, also nichts schieb, kann die Datei nur leer sein. Aber genau dieses eher "unvorhersehbare" Verhalten der Delphifunktionen veranlaßt mich direkt auf die WinAPI auszuweichen. Vorallem da man da meist selbst bei einem Fehler nicht mit 'ner Exception erschlagen wird. :nerd: |
Re: I/O-Fehler-998
:) ja nächstes problem is ja dass er will das die programme auf jedem rechner laufen ;)
aber zumindest dieses darf ich auf windows hinschneiden ;D nochmals danke - ich meld mich wenn mir noch irgendeine frage dazu einfällt mfg nico |
Re: I/O-Fehler-998
und da isses auch schon :)
die geladenen zahlen etc sind bsi auf ca 100 ausnahmen alles 0en :( was is da falsch gelaufen? die zuweisung stimmt - ist alles auf nen wert der nicht 0 entspricht gesetzt aber beim laden kommt was falsches raus lg nico |
Re: I/O-Fehler-998
Wie speichest/lädst das denn nun jetzt?
nicht das dort z.B. nur der Zeiger auf die Daten gespeichert wrd, sondern die Daten selber. |
Re: I/O-Fehler-998
Delphi-Quellcode:
und zum laden
var
FaDatei: file of TAlles; Buf: TAlles; begin if SaveDialog1.Execute then { Dialog zum Speichern anzeigen } begin AssignFile(FaDatei, SaveDialog1.FileName); Rewrite(FaDatei); { Ausgabedatei öffnen } Write(FaDatei, Buf); CloseFile(FaDatei); end; end;
Delphi-Quellcode:
var i,e, f : Integer;
FaDatei1: file of TAlles; Alles1 : Talles; begin if OpenDialog1.Execute then { Dialog zum Öffnen anzeigen } begin AssignFile(FaDatei1, OpenDialog1.FileName); Reset(FaDatei1); { Eingabedatei öffnen } Read(FaDatei1, Alles1); CloseFile(FaDatei1); end; for i := 0 to 29 do for e := 0 to 21 do Memo1.Lines.add(alles1.vert_ast[i][e]); for i := 0 to 30 do Memo1.Lines.add(IntToStr(alles1.vert_datum[i].vtjahr)); for i := 0 to 30 do for e := 0 to 10 do Memo1.Lines.add( IntToStr(alles1.vert_datum[i].vtproz[e])); for i := 0 to 14 do Memo1.Lines.add( alles1.mod_[i].und_bez); for i := 0 to 14 do for e := 0 to 30 do Memo1.Lines.add( alles1.mod_[i].und_st[e].st_bez); for i := 0 to 14 do for e := 0 to 30 do for f := 0 to 10 do Memo1.Lines.add(IntToStr(alles1.mod_[i].und_st[e].st_jahr[f])); for i := 0 to 14 do Memo1.Lines.add(alles1.mod_[i].und_st[e].st_vert); for i := 0 to 14 do for e := 0 to 30 do for f := 0 to 10 do Memo1.Lines.add(IntToStr(alles1.mod_[i].und_st[e].st_aufk[f])); Label1.caption := IntToStr(Memo1.Lines.Count); |
Re: I/O-Fehler-998
Liste der Anhänge anzeigen (Anzahl: 1)
ach ja, sagt dein compiler eigentlich nichts dazu?
Delphi-Quellcode:
e ist nicht definiert :zwinker:
for i := 0 to 14 do
Memo1.Lines.add(alles1.mod_[i].und_st[e].st_vert); und beim befüllen des Records ebenfalls nicht. also hier funktioniert es :gruebel: |
Re: I/O-Fehler-998
hm irgendwas is bei dir anders :) aber es funktioniert jetzt :D vielen vielen dank
wenns mal zufällig in graz sein solltest lad ich dich auf ein getränk ein :wink: lg Nico |
Re: I/O-Fehler-998
Problem gefunden:
Delphi-Quellcode:
du hattest ja Buf mit nichts gefüllt.
Write(FaDatei, Buf);
|
Re: I/O-Fehler-998
danke habs dann später sleber rausgefunden :)
danke für deine zeit und nerven :D bleibt mal wiedern ur zu sagen :dp: lg Nico |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz