| |
|
|
| |
|
| |
|
|
|
Michael Wodrich | Ja, dann ists klar. Und mit iFs drumherum-Funktionen werden sich auch die C-Indianer hier wohl fühlen.
Allerdings kann zu Fuß programmiert ein weiteres Assign bei obigem Beispiel von Roland entfallen.
Das eine ist gut per weitere Bearbeitung, das andere ist gut per sofortige Handle-Freigabe.
Danke Schöne Grüße Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 02.05.2006 ▲ |
|
|
|
|
RGH | [quote:4504e32796=iF]Aha also müsste ein echtes fopen/fclose so aussehen: ...[/quote:4504e32796] Korrekt! |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 02.05.2006 ▲ |
|
|
|
|
H.Brill | Irgendwas scheint aber nicht frei gegeben zu werden. Beim erneuten Schreiben in un mit OpenRW geöffneten File, ist der letzte DS doppelt drin, wenn die zu schreibenden Daten weniger sind. Also statt 3 DS nur noch 2 drin stehen sollten.
Declare Long datei, Memory Waren[]
Set("Decimals", 2)
Struct Artikel = Name$(30), Preis!
Dim Waren[], Artikel
SetSize Waren[], 3
datei = Assign($ProgDir + "Waren.dat")
OpenRW datei
With Waren[0]
Waren[0].Name$ = "Milch"
Waren[0].Preis! = 0.99
EndWith
With Waren[1]
Waren[1].Name$ = "Butter"
Waren[1].Preis! = 2.25
EndWith
With Waren[2]
Waren[2].Name$ = "Käse"
Waren[2].Preis! = 3.55
EndWith
Print "\nAus dem Array gelesen :"
AusgabeArray()
Speichern()
Print "\nTaste per Dateiausgabe..."
WaitKey
Ausgabe()
Print "\nDelete Satz Nr. 2 in Datei"
WaitKey
Arrdel Waren[], 1, 1
Print "\nAusgabe Array nach ArrDel"
Waitkey
AusgabeArray()
Speichern()
Print "\nNach Speichern der neuen File."
Ausgabe()
WaitKey
Proc Speichern
Declare Long offset
Assign #1, $ProgDir + "Waren.dat"
Erase #1
Close #1
Assign #1, ""
Assign #1, $ProgDir + "Waren.dat"
OpenRW #1
offset = 0
WhileLoop 0, SizeOf(Waren[]) - 1
BlockWrite #1, Waren[&LOOP]
Inc offset, 35
EndWhile
Close #1
Assign #1, ""
EndProc
Proc Ausgabe
Declare Long Records
Assign #1, $ProgDir + "Waren.dat"
OpenRW #1
Records = GetFileSize(#1) / 34
Clear Waren[]
SetSize Waren[], Records
Seek #1, 0
WhileLoop 0, Records - 1
BlockRead(#1, Waren[&LOOP], 0, SizeOf(Waren[&LOOP]))
With Waren[&LOOP]
Print "Artikel :", .Name$, "Preis : ", .Preis!
EndWith
EndWhile
Close #1
Assign #1, ""
EndProc
Proc AusgabeArray
WhileLoop 0, SizeOf(Waren[]) - 1
With Waren[&LOOP]
Print "Artikel : ", Waren[&LOOP].Name$, "Preis :", Waren[&LOOP].Preis!
EndWith
EndWhile
Speichern()
EndProc
End
Scheint so, als wäre ein profaninterner Speicherbereich, der nicht oder nicht vollständig zurück gesetzt wurde, beteiligt. Die File wird ja vor dem erneuten Schreiben gelöscht. ArrDel funktioniert mal jedenfalls richtig. Was mir noch aufgefallen ist : Erst, wenn ich die File mit dem Explorer gänzlich gelöscht habe, sind auch die Reste vom Dateiende verschwunden. |
|
|
| Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 29.11.2023 ▲ |
|
|
|
|
Georg Teles | Nabend,
schau mal in Zeile 7, füge einfach mal nach OpenRW datei
solange die File "doppelt geöffnet" ist, scheint XProfan die alte Dateigröße von 177 Bytes statt neuen 78 auszulesen, weil diese gesperrt ist, so wird sie auch mit Erase nicht gelöscht, daher verzwickt sich das
dann klappts
dein ganzer Code:
Declare Long datei, Memory Waren[]
Set("Decimals", 2)
Struct Artikel = Name$(30), Preis!
Dim Waren[], Artikel
SetSize Waren[], 3
datei = Assign($ProgDir + "Waren.dat")
OpenRW datei
Close datei
With Waren[0]
Waren[0].Name$ = "Milch"
Waren[0].Preis! = 0.99
EndWith
With Waren[1]
Waren[1].Name$ = "Butter"
Waren[1].Preis! = 2.25
EndWith
With Waren[2]
Waren[2].Name$ = "Käse"
Waren[2].Preis! = 3.55
EndWith
Print "\nAus dem Array gelesen :"
AusgabeArray()
Speichern()
Print "\nTaste per Dateiausgabe..."
WaitKey
Ausgabe()
Print "\nDelete Satz Nr. 2 in Datei"
WaitKey
Arrdel Waren[], 1, 1
Print "\nAusgabe Array nach ArrDel"
Waitkey
AusgabeArray()
Speichern()
Print "\nNach Speichern der neuen File."
Ausgabe()
WaitKey
Proc Speichern
Declare Long offset
Assign #1, $ProgDir + "Waren.dat"
Erase #1
Close #1
Assign #1, ""
Assign #1, $ProgDir + "Waren.dat"
OpenRW #1
offset = 0
WhileLoop 0, SizeOf(Waren[]) - 1
BlockWrite #1, Waren[&LOOP]
Inc offset, 35
EndWhile
Close #1
Assign #1, ""
EndProc
Proc Ausgabe
Declare Long Records
Assign #1, $ProgDir + "Waren.dat"
OpenRW #1
Records = GetFileSize(#1) / 34
Clear Waren[]
SetSize Waren[], Records
Seek #1, 0
WhileLoop 0, Records - 1
BlockRead(#1, Waren[&LOOP], 0, SizeOf(Waren[&LOOP]))
With Waren[&LOOP]
Print "Artikel :", .Name$, "Preis : ", .Preis!
EndWith
EndWhile
Close #1
Assign #1, ""
EndProc
Proc AusgabeArray
WhileLoop 0, SizeOf(Waren[]) - 1
With Waren[&LOOP]
Print "Artikel : ", Waren[&LOOP].Name$, "Preis :", Waren[&LOOP].Preis!
EndWith
EndWhile
Speichern()
EndProc
End
Grüße Georg |
|
|
| |
|
|