AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Anfänger - wie Zahlen zum rechnen in Datei speichern ?
Thema durchsuchen
Ansicht
Themen-Optionen

Anfänger - wie Zahlen zum rechnen in Datei speichern ?

Ein Thema von Jiron · begonnen am 3. Jul 2009 · letzter Beitrag vom 8. Jul 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#11

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 5. Jul 2009, 11:11
Zitat von Jiron:
Es ist schon erstaunlich wieviele Möglichkeiten es für ein Problem gibt.
ich sag nur http://www.delphipraxis.net/internal...t.php?t=145265



Also wenn du eh alles während der Laufzeit im Arbeitsspeicher in dem Array hast, dann brauchst du es ja nur am Anfang einmal zu laden und am Ende komplett zu speichern

Delphi-Quellcode:
var X: TIntegerDynArray{Array of Integer};
  MyFile: File;

// speichern
AssignFile(MyFile, ...);
{$I-}
ReWrite(MyFile);
{$I+} 
if IOResult=0 then
begin;
  if X <> nil then BlockWrite(MyFile, @X[0], Length(X) * SizeOf(Integer));
  CloseFile(MyFile);
end;

// speichern
AssignFile(MyFile, ...);
{$I-}
Reset(MyFile);
{$I+} 
if IOResult=0 then
begin;
  SetLength(X, FileSize(MyFile) div SizeOf(Integer));
  if X <> nil then BlockRead(MyFile, @X[0], Length(X) * SizeOf(Integer));
  CloseFile(MyFile);
end;


Delphi-Quellcode:
var X: TIntegerDynArray{Array of Integer};
  FS: TFileStream;

// speichern
FS := TFileStream.Create()
{$I-}
ReWrite(MyFile);
{$I+} 
if IOResult=0 then
begin;
  if X <> nil then BlockWrite(MyFile, @X[0], Length(X) * SizeOf(Integer));
  CloseFile(MyFile);
end;

// speichern
AssignFile(MyFile, ...);
{$I-}
Reset(MyFile);
{$I+} 
if IOResult=0 then
begin;
  SetLength(X, FileSize(MyFile) div SizeOf(Integer));
  if X <> nil then BlockRead(MyFile, @X[0], Length(X) * SizeOf(Integer));
  CloseFile(MyFile);
end;
Und das Ganze nochmals per FileStream (wurde oben auch schonmal genannt)
Delphi-Quellcode:
//speichern
FS := TFileStream.Create(...);
if X <> nil then FS.WriteBuffer(@X[0], Length(X) * SizeOf(Integer));
FS.Free;

// lesen
FS := TFileStream.Create(...);
SetLength(X, FS.Size div SizeOf(Integer));
if X <> nil then FS.Readbuffer(@X[0], Length(X) * SizeOf(Integer));
FS.Free;
PS: das if X <> nil then entspricht if Length(X) > 0 then, also es ist dir überlassen, was du nutzt und wenn das Array beim Laden und Speichern nie leer ist, dann kannst du diese Abfrage auch weglassen.
Aber es gibt halt Probleme (einen nette Exception) bei einem leeren Array, wenn man dort per @X[0] auf ein nicht existierenses Element zugreifen möchte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#12

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 5. Jul 2009, 11:51
OT: Das war SOOOO genial!!!
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 6. Jul 2009, 11:00
Hallo Zusammen,

ich möchte einmal aus der Delphi-Hilfe zitieren:
Zitat:
Alle anderen Methoden eines Handle-Streams zum Lesen von Daten (ReadBuffer, ReadComponent) rufen die Methode Read für den eigentlichen Lesevorgang auf.
gleiches gilt sinngemäß für Write und WriteBuffer

Write/Read-Buffer sind Proceduren denen der Buffer und die Anzahl Bytes übergeben wird. Sollte beim Lesen bzw. Schreiben ein Fehler auftauchen wird eine Exception ausgelöst, die ggf. zu verarbeiten ist.

Read/Write sind Funktionen, denen der der Buffer und die Anzahl Bytes übergeben wird. Zurück gegeben wird die Anzahl der tatsächlich gelesenen/geschriebenen Bytes. Daher Kann man ohne eine Exception-Behandlung auf "Fehler" beim Lesen/Schreiben reagieren.

Für mich ist es daher Geschmackssache welche Routine man einsetzt. Da ich des öfteren das ältere BlockRead/Blockwrite zu ersetzen habe, bevorzuge ich Read und Write.

Delphi-Quellcode:
......
fs:=tfilestream.create(meinedatei);
lies:=x;
repeat
  gelesen:=fs.read(buffer,lies);
  if gelesen >0 then
  {tuwas
  for i:=0 to gelesen-1 do ........ }

until gelesen<>lies;
fs.free;

....

fs:=tfilestream.create(meinedatei);
counter:=0;
lies:=x;
repeat
  try
  fs.readbuffer(buffer,lies);
  {tuwas
  for i:=0 to lies-1 do ........ }

  except
    showmessage('lesefehler');
    exit;
  end;
  inc(counter,1);
until counter>y;
fs.free;
....
Da intern fs.read/fs.write von fs.readbuffer/fs.writebuffer aufgerufen wird sehe ich keinen Grund es nicht gleich zu verwenden.

Gruß
K-H
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#14

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 6. Jul 2009, 11:19
@stoxx: SteWriteBuffer: Delphi nutzt schon einen Lese-/Schreibpuffer, allerdings ist dieser 128 Byte groß (also etwas unoptimal und ist standardmäßig direkt in der Datei-Variable eingebaut bzw. an dieser direkt hinten drangehängt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#15

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 6. Jul 2009, 14:58
[quote="Jiron"]
Delphi-Quellcode:
   if (z1>=z2)or(z1>=z3)or(z1>=z4)or(z1>=z5)or(z1>=z6)or(z1=zz)then exit;
   if (z2>=z3)or(z2>=z4)or(z2>=z5)or(z2>=z6)or(z2=zz)then exit;
   if (z3>=z4)or(z3>=z5)or(z3>=z6)or(z3=zz)then exit;
   if (z4>=z5)or(z4>=z6)or(z4=zz)then exit;
   if (z5>=z6)or(z5=zz)then exit;
   if z6=zz then exit;
Hier könntest du später wenn du Lust hast einfach einen Sortieralgorithmus einbauen:
Sortieren
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat
Jiron

Registriert seit: 25. Jun 2009
Ort: Krefeld
10 Beiträge
 
Delphi 6 Enterprise
 
#16

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 6. Jul 2009, 22:14
Hallo isilive

Danke für den Hinweis wo ich wegen dem Sortieren dann schon mal nachsehen kann.
Im Moment versuche ich noch die hier mir im Forum oben angegebenen Beispiele mal durchzuarbeiten. Sowie ich dann mit dem Dateibearbeiten klar komme, mache ich mich an eine effizientere Programmierung.
Noch bekomme ich aber immer wieder die schon oben erwähnte Fehlermeldung:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ProjectLOTTO.exe ist eine Exception der Klasse EInOutError aufgetreten. Meldung: 'E/A-Fehler 6'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------

und das immer wenn das Programm was machen soll, wie z.B.
Write(MyFile,nr) oder BlockWrite (fMyFile, MyFile [1],7);


Und da ich des englischen nicht mächtig bin, haben mir die bisher gefundenen englischen Erlärungen nicht wirklich weiter geholfen - aber wird schon werden.
Gruß und Danke dir
Jiron
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#17

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 6. Jul 2009, 22:25
Ich nehme mal an, MyFile bezeichnet bei dir immernoch ein Array (genau das meinte ich mit widersprüchlicher Benennung)

Und wenn du jetzt das hier aufrufst:Write(MyFile,nr) // oder AssignFile oder Reset oder Rewrite oder Seek Dann übergibst du der Funktion ein Array und eine Zahl.

Die Funktion hat aber keine Ahnung, in welche Datei Sier schreiben soll.

Das liegt daran: Die Funktion erwartet an erster Stelle einen Dateizeiger. Du übergibt ein Array. Die Funktion versucht nun, das Array als Dateizeiger zu interpretieren. Das geht schief. Also wird dir eine Fehlermeldung um die Ohren gepfeffert
Da die Funktionen ... sagen wir ... seit geraumer Zeit existieren ... ist diese Fehlermeldung jetzt nicht so vielsagend.

Da du dein Array MyFile genannt hast, haben bestimmt einige gedacht, es würde sich schon um einen Dateizeiger handeln - mein Vorschlag: MyData oder Numbers odert sowas.

Was man den Funktionen genau übergeben muss, hat himitsu dir schon hier gezeigt

Ich hoffe, wenigstens etwas von dem stimmt
  Mit Zitat antworten Zitat
Jiron

Registriert seit: 25. Jun 2009
Ort: Krefeld
10 Beiträge
 
Delphi 6 Enterprise
 
#18

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 7. Jul 2009, 13:58
Hallo jfheins

Ich hab mal unten ein Stück Programm aufgeführt, bei dem die o.g. Fehlermeldung in der Zeile:

System.Seek(MyFile,SizeOf(MyFile)); kommt. Jedenfalls ist diese dann makiert.


var
Myfile : file of integer;
Nr: integer ;
FN : string ;
begin
/..............
begin;
AssignFile(MyFile,FN);
{$I-}
if FileExists(FN)then
Reset(MyFile)
else
Rewrite(MyFile);
{$I+}
if IOResult=0 then
begin;
System.Seek(MyFile,SizeOf(MyFile))
Write(MyFile,z1);
end;
CloseFile(MyFile);
end;
/................

Edit8.Text := IntToStr(z1);
end;

Ich bin aber jetzt durch einen Beitrag in diesem Forum auf die Tutorials vom "Delphi-Treff" gestosen und werd mich dort erst mal durcharbeiten. Das wird ja langsan sogar für mich als Anfänger hier peinlich. Ich meld mich dann wieder.
Danke dir aber für deine Mühe.

Und danke noch mal an alle die sich hier gemeldet haben, war echt erstaunt.

Gruß Jiron
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#19

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 7. Jul 2009, 14:10
Was soll System.Seek(MyFile,SizeOf(MyFile)) eigentlich bewirken?
in Delphi2009 dürfte SizeOf 720 Byte liefern und davor so 460 Byte ... also würde zum 460-ten bzw. 720-ten Integer gesprungen werden, aber da du die Datei mit Rewrite geöffnet hast, ist diese Datei leer.

[edit] hab mich verguckt: D2009 meint MyFile wäre 592 Byte groß und D7 sagt was von 332 Byte, aber da sieht man mal, wie "unterechenbar" dieser Typ ist
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

Re: Anfänger - wie Zahlen zum rechnen in Datei speichern ?

  Alt 7. Jul 2009, 14:49
Hallo ,

So sollte es etwas sinnvoller sein:
Delphi-Quellcode:
var
  Myfile : file of integer;
  Nr: integer ;
  FN : string ;
begin
/..............
begin
  AssignFile(MyFile,FN);
{$I-} 
  if FileExists(FN)then
    Reset(MyFile)
  else
    Rewrite(MyFile);
{$I+} 
  if IOResult=0 then
  begin
    System.Seek(MyFile,Filesize(MyFile))
    Write(MyFile,z1);
  end;
  CloseFile(MyFile);
end;
/................
Gruß
K-H

edit: verlesen,und geschlampt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 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