Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mo 02.09.13 13:05 
Moderiert von user profile iconNarses: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  FS.Read( aByte, 1 );      // Read
  aByte := aByte xor Mask;  // Crypt
  FS.Position := FS.Position -1// go back
  FS.WriteBuffer( aByte, 1 ); //Write

das klappt so, dagegen klappt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  FS.Read( aByte, 1 );      // Read
  aByte := aByte xor Mask;  // Crypt
  FS.Position := FS.Position -1// go back
  FS.Write( aByte, 1 ); //Write

nicht !


oder gibt es dafür andere erklärungen`?

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 04.09.13 10:39 
ob seek( x ) oder Position := x; ich merke keinen unterschied !

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.09.13 13:30 
Das könnte daran liegen, dass Position intern auch nur Seek verwendet. ;-)
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 04.09.13 18:02 
Hach ist hier viel Halbwissen. Use the source, Luke!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TStream.WriteBuffer(const Buffer; Count: Longint);
begin
  if (Count <> 0and (Write(Buffer, Count) <> Count) then
    raise EWriteError.CreateRes(@SWriteError);
end;

:arrow: einziger Unterschied ist eine Exception wenn's nicht klappt.

user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 04.09.13 18:16 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Hach ist hier viel Halbwissen. Use the source, Luke!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TStream.WriteBuffer(const Buffer; Count: Longint);
begin
  if (Count <> 0and (Write(Buffer, Count) <> Count) then
    raise EWriteError.CreateRes(@SWriteError);
end;


wenn das so wäre, was ich gerne glaube, würde ich gerne eine Erklärung haben, warum es mit write nicht funktioniert, mit writebuffer schon !

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 04.09.13 20:24 
ich meinte Write und Writebuffer.. Writebuffer funktioniert, write alleine nicht

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :nixweiss:
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 04.09.13 21:22 
ausblenden 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
{Mask erstellen}
  FS.Read( aByte, 1 );      // Read
  aByte := aByte xor Mask;  // Crypt
  Seek( FS.Position -1 , soFromBeginning ); // go back
  FS.WriteBuffer( aByte, 1 ); //Write
  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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.09.13 22:11 
:shock:
Vor dem Seek hast du das FS vergessen. Dass das nicht geht, ist klar...

Wie wärs einfach so...
ausblenden Delphi-Quelltext
1:
FS.Seek(-1, soFromCurrent);					
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 04.09.13 23:27 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
Falls man etwas in einem Stream überschreiben will, MUSS man Writebuffer verwenden (vorher Position entsprechend setzten)

Das ist falsch, denn das hier funktioniert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TMainform.Button1Click(Sender: TObject);
var
  FS       : TFileStream;
  Schleife : Integer;
  Wert     : Byte;
  Maske    : Byte;
begin
  FS := TFileStream.Create('f:\x.xxx', fmCreate);
  try
    Wert := 65;
    for schleife := 1 to 100 do
      FS.Write(Wert, SizeOf(Wert));
    FS.Position := FS.Position - 1;
    FS.Read(Wert, 1);
    Maske := 122;
    Wert := Wert XOR Maske;
    FS.Position := FS.Position - 1;
    FS.Write(Wert, SizeOf(Wert));
  finally
    FS.Free;
  end;
end;
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Do 05.09.13 13:41 
user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
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)



user profile iconrushifell hat folgendes geschrieben Zum zitierten Posting springen:
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 :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.09.13 13:46 
user profile iconIhopeonlyReader hat folgendes geschrieben Zum zitierten Posting springen:
aber als ich jetzt Write verwendete funktionierte es, mein Delphi spinnt öfter mal :( (sagte ich schonmal)
Delphi spinnt da sicher nicht mal und mal nicht. Solange du nicht gerade Speicherprobleme hast, sprich an Stellen geschrieben hast, die nicht zum Schreiben waren, kann das nicht sein.

Wenn du debuggst und dabei im Debugger auf die Werte schauen willst, solltest du die Optimierung in den Projektoptionen deaktivieren. Das Verhalten mit Optimierung kann im Debugger schon mal komisch aussehen. ;-)
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: 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?