Autor |
Beitrag |
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mo 02.09.13 13:05
Moderiert von Narses: Abgetrennt von [url=www.entwickler-ecke....t=111829]hier[/url].
ich habe noch einen Unterschied festgestellt !
Falls man etwas in einem Stream überschreiben will, MUSS man Writebuffer verwenden (vorher Position entsprechend setzten)
Write hängt es hinten dran oder macht gar nix damit :O
Writebuffer überschreibt und fertig
Hab ich heute erst bemerkt, denn
Delphi-Quelltext 1: 2: 3: 4:
| FS.Read( aByte, 1 ); aByte := aByte xor Mask; FS.Position := FS.Position -1; FS.WriteBuffer( aByte, 1 ); |
das klappt so, dagegen klappt
Delphi-Quelltext 1: 2: 3: 4:
| FS.Read( aByte, 1 ); aByte := aByte xor Mask; FS.Position := FS.Position -1; FS.Write( aByte, 1 ); |
nicht !
oder gibt es dafür andere erklärungen`?
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
Blup
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Mo 02.09.13 17:55
Wer "Write" verwendet muss immer den Rückgabewert auswerten (sonst kann man nur raten wie das Ergebnis zustande kommt).
Abhängig vom Stream eventuell auch noch LastError.
Das sollte man besser dem Stream selbst überlassen, sonst schafft man unnötige Abhängigkeiten.
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Di 03.09.13 00:39
Bist du Dir sicher, dass das Offset zum Lesen und Schreiben korrekt ist?
Kennst Du die Methode 'seek'?
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mi 04.09.13 10:39
ob seek( x ) oder Position := x; ich merke keinen unterschied !
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 04.09.13 13:30
Das könnte daran liegen, dass Position intern auch nur Seek verwendet.
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mi 04.09.13 17:05
Warum sollte das im Ergebnis einen Unterschied machen? Habe ich nie behauptet.
Habe mich nur gewundert, dass Du die Position so umständlich setzt.
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 04.09.13 18:02
Hach ist hier viel Halbwissen. Use the source, Luke!
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TStream.WriteBuffer(const Buffer; Count: Longint); begin if (Count <> 0) and (Write(Buffer, Count) <> Count) then raise EWriteError.CreateRes(@SWriteError); end; |
einziger Unterschied ist eine Exception wenn's nicht klappt.
IhopeonlyReader hat folgendes geschrieben : | ob seek( x ) oder Position := x; ich merke keinen unterschied ! |
Doch, da ist einer. Ein Lesezugriff auf Position ist ein Seek(0, soFromCurrent), ein Schreibzugriff Seek(aValue, soFromBeginning). Verwendest du das Property, sind da zwei Dateioperationen, Seek(-1, soFromCurrent) direkt aufzurufen ist also schneller. Wenn man das ein paar tausend mal macht, fällt das schon (natürlich auch abhängig von der Streamklasse) auf.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mi 04.09.13 18:16
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mi 04.09.13 19:22
Deshalb habe ich geschrieben, das es im "Ergebnis" keinen Unterschied macht. Beides funktioniert. Dass Position intern Seek aufruft, hat ja bereits Jaenicke geschrieben. Dass es daher mehr Sinn macht, direkt Seek zu verwenden ist dadurch ja klar.
In den Personal Editions gibt's leider keinen Source.
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mi 04.09.13 20:24
ich meinte Write und Writebuffer.. Writebuffer funktioniert, write alleine nicht
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 04.09.13 20:52
Ohne ein konkret funktionierendes Beispielprojekt wird da wohl niemand mehr dazu sagen können. Bei mir haben Write und WriteBuffer immer funktioniert wie sie sollen.
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mi 04.09.13 21:22
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| var aByte, Mask: Byte; C: Integer; FS: TFileStream; begin FS := TFileStream.Create( aFileName, fmOpenReadWrite or fmShareDenyRead or fmShareDenyWrite ); try FS.Position := 0; For C := 1 to FS.Size do begin
FS.Read( aByte, 1 ); aByte := aByte xor Mask; Seek( FS.Position -1 , soFromBeginning ); FS.WriteBuffer( aByte, 1 ); end; finally FS.Free; end; end; |
aber als ich jetzt Write verwendete funktionierte es, mein Delphi spinnt öfter mal
Delphi neustarten lässt write plötzlich auch in der compilierten exe funktionieren
Und bei einem anderen Programm habe ich sogar das Problem, dass sich meine Form nicht enabled obwohl ich sie nie disable :O Meine Form wird also nicht ansprechbar, bei allen anderen Projekten funktionierts, nur da nicht... es liegt ganz sicher kein fehler vor ! Aber ich muss wohl wieder 2-3 tage warten und dann Wunder funktionierts wieder..
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 04.09.13 22:11
Vor dem Seek hast du das FS vergessen. Dass das nicht geht, ist klar...
Wie wärs einfach so... Delphi-Quelltext 1:
| FS.Seek(-1, soFromCurrent); |
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mi 04.09.13 22:20
Zeile 8 ist überflüssig, einfach weglassen. Und wenn du FS.Read verwendest, musst du den Rückgabewert überprüfen.
Eine For-Schleife zu verwenden, wäre mir auch nicht geheuer.
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Mi 04.09.13 22:46
ja, eigentlich steht da
FS.Position := FS.Position -1;
aber ich wollte es auf "eure" Vorschläge schonmal anpassen..
Ob Zeile 8 überflüssig ist, weiß ich nicht. Lieber initialisieren
und warum soll eine For-Schleife nicht geheuer sein? Ich gehe Byte für Byte durch, dass ich das genau so oft mache, wie viele Bytes enthalten sind ist doch logisch oder?
Bei Read und Write überprüfe ich keine Rückgabewerte ! Es wird das gemacht, was möglich ist.
Wenn ich ein 2tes mal mache, wird es ebenso nicht möglich sein, und somit macht es kein Unterschied ! ggf. könnte ich, falls der positionszeiger nicht aktualisiert wird, da das schreiben/lesen nicht geklappt hat, diesen einen weiter setzten, sonst versucht er immer an der "nicht möglich" stelle zu lesen, aber wenn ich gehe davon aus, dass alles oder nichts klappt. ich kenne keine Datei die nur zulässt Byte 1-X und ab X+1 zu beschreiben..
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Mi 04.09.13 23:11
Du bist sehr beratungsresistent.
Zuletzt bearbeitet von rushifell am Mi 04.09.13 23:34, insgesamt 2-mal bearbeitet
|
|
Gerd Kayser
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: Mi 04.09.13 23:27
|
|
IhopeonlyReader
Beiträge: 600
Erhaltene Danke: 23
Delphi 7 PE
|
Verfasst: Do 05.09.13 13:41
Gerd Kayser hat folgendes geschrieben : | IhopeonlyReader hat folgendes geschrieben : | Falls man etwas in einem Stream überschreiben will, MUSS man Writebuffer verwenden (vorher Position entsprechend setzten) |
Das ist falsch, denn das hier funktioniert: |
aber als ich jetzt Write verwendete funktionierte es, mein Delphi spinnt öfter mal (sagte ich schonmal)
rushifell hat folgendes geschrieben : | Du bist sehr beratungsresistent. |
Naja, deine Aussage
Zitat: | Eine For-Schleife zu verwenden, wäre mir auch nicht geheuer.
|
sagt soviel wie, "ich würde eine andere schleife verwenden"
da ich sonst nur while und repeat kenne und diese langsamer sind frage ich mich, warum ich while oder repeat benutzen sollte, ich weiß doch wieviele Bytes ich durchgehen muss...
Zu dem "FS vergessen" habe ich auch ausgesagt, dass das eine Anpassung war und nicht direkt die Fehlerquelle..
_________________ Sucht "neueres" Delphi
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.09.13 13:46
|
|
rushifell
Beiträge: 306
Erhaltene Danke: 14
|
Verfasst: Do 05.09.13 17:42
Wo hast Du das aufgeschnappt, dass man nach dem Erzeugen eines Streams die Position auf 0 bzw. den Anfang setzen muss? Hab ich noch nie gesehen, lass mich aber gerne eines Besseren belehren.
Wenn Du die Rückgabewerte nicht prüfst, ist das zumindest meiner Meinung nach schlechter Programmierstil. Dann nimm lieber ReadBuffer.
Nicht alles, was funktioniert ist gut. Die For-Schleife ist schon in Ordnung. Warum soll aber die For-Schleife schneller sein? Hast Du Beweise dafür?
|
|