| Autor |
Beitrag |
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 15:51
Hallo,
ich habe schon einen Post weiter unten geschreben, in dem es um den Zugriff auf eine Datei geht und jetzt kann ich eine Datei mit TFileStrem öffnen (Danke an jaenicke)
Aber mein Programm ließt nur die ersten 4 Bytes aus.
Kann mir jemand helfen? Hier mein Quellcode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var Form1: TForm1; datei : TFileStream; i : integer; inhalt : char;
if OpenDialog1.Execute then begin
datei := TFileStream.Create(Opendialog1.FileName, fmOpenRead); try datei.ReadBuffer(i, sizeof(i)); finally datei.Free; end; richedit1.text := IntToStr(i); |
und zum speichern:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if SaveDialog1.Execute then begin
datei := TFileStream.Create(Savedialog1.FileName, fmCreate); datei.Write(i, sizeof(i)); datei.Free;
end; |
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.05.09 16:21
Naja, mehr machst du ja auch nicht, du liest nur einen (4 Byte) Integerwert aus und schreibst auch nur den.
Wenn du die ganze Datei lesen willst, musst du das in einer Schleife machen.
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 11.05.09 16:22
www.delphi-forum.de/...+auslesen_91980.html
Man beachte den letzten Post von jaenicke
Nimm ne Schleife dafür.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 16:26
ja ok soweit war ich auch scon aber ich hab keine idee welche schleife ich für sowas nehmen soll... wahrscheinlich ne whileschleife, aber was soll drin stehn ?!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.05.09 16:29
for geht doch gut, die Größe des Streams steht ja in DeinStream.Size drin.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 16:32
Wie du im anderen Thema schon geschrieben hast (dass du ein neues Thema aufgemacht hast, find ich übrigens gar nicht gut - hab das Thema schon gemeldet  ), willst du die Musikdatei verschlüsseln.
Am besten nimmst du dir zwei Streams und liest aus dem einen, verschlüsselst es und schreibst dann das Ergebnis in den zweiten Stream. Dabei liest du dann jeden Block (könnte z.B. ein Byte sein) in eine entsprechende Variable, verschlüsselst den Block und schreibst ihn ganz einfach in den zweiten. Du brauchst kein Array und kein gar nichts - nur eine Variable.
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 16:32
also dann
Delphi-Quelltext 1: 2: 3: 4:
| for i:= i to datei.size do begin datei.ReadBuffer(ii, sizeof(i)); end; |
oder was?
Zuletzt bearbeitet von Georg08 am Mo 11.05.09 16:34, insgesamt 1-mal bearbeitet
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 16:34
Das ist doch schon mal ein Ansatz! Jetzt brauchst du nur noch den zweiten Stream und die entsprechende Schreibmethode.
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 16:36
leider nicht kommt "Stream-Lesefehler" raus...
außerdem steht da
[Warnung] Unit1.pas(42): FOR-Schleifenvariable muss eine einfache lokale Variable sein
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.05.09 16:40
Ja, weil du vermutlich 4 Byte Integerwerte liest. Die Anzahl ist aber in Byte, deshalb muss die Variable dann auch vom Typ Byte sein.
Das ist so allerdings sehr langsam, um mehr zu lesen ist später dann ein größerer Puffer sinnvoll, aber das kommt danach.
Und die Warnung ist klar, du benutzt globale Variablen, was ohnehin extrem unübersichtlich ist.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 11.05.09 16:41
Hoppla, ist mir gar nicht aufgefallen:
Georg08 hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4:
| for i:= i to datei.size do begin datei.ReadBuffer(ii, sizeof(i)); end; |
oder was? |
Gibt dir Delphi denn keine Warnung aus, von Wegen i wäre nicht initialisiert? Natürlich muss die Schleife von 0 an laufen.
Die zweite Markierung hat jaenicke ja schon agesprochen, und das letzte ist IMHO ein Tippfehler beim Bearbeiten - vor deinem Edit war das noch richtig, oder?
Edit: Ich hasse diese Edit-Funktion
Edit 2: Ach ne, die dritte Markierung war ja ein Bugfix von dir, das stimmt ja so 
Zuletzt bearbeitet von Yogu am Mo 11.05.09 16:45, insgesamt 2-mal bearbeitet
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 16:43
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var i: byte; ii : integer;
for i := i to datei.size do begin datei.ReadBuffer(ii, sizeof(i)); end; |
Gibt nur eine Zahl aus : "1"
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.05.09 16:46
Wenn du nach der Schleife den einen Wert ausgibst, dann kann da ja auch nur der eine angezeigt werden, die werden in der Schleife ja jedesmal wieder überschrieben... Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; Value: Byte; Datei: TFileStream; begin if OpenDialog1.Execute then begin Datei := TFileStream.Create(Opendialog1.FileName, fmOpenRead); try for i := 1 to Datei.Size do begin Datei.ReadBuffer(Value, SizeOf(Value)); ShowMessage(IntToStr(Value)); end; finally Datei.Free; end; end; end; |
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 17:03
und wenn ich jetzt
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; i2, itemp: Byte; Datei: TFileStream; begin if OpenDialog1.Execute then begin Datei := TFileStream.Create(Opendialog1.FileName, fmOpenRead); try for i := 1 to Datei.Size do begin Datei.ReadBuffer(i2, SizeOf(i2)); itemp := itemp+i2; end; finally Datei.Free; end; end; end; |
machen würde, hättte ich dann in itemp den kompletten wert des mp3?
Zuletzt bearbeitet von Georg08 am Mo 11.05.09 17:13, insgesamt 1-mal bearbeitet
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 11.05.09 17:13
Denke dir eine Zahl 1234
wenn du diese jetzt von vorne an durchläufst und + rechnest, hast du dann 1+2+3+4 = 10, oder hast du dann die Ausgangszahl 1234?
Wie soll denn die ganze Datei in EIN Byte passen? Wenn schon, dann ein Array of byte.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 17:14
xD ups also in eine stringvariable?!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 11.05.09 17:16
Ja, von mir aus auch ein String. Oder ein array of byte, damit geht es auch.
Tipp mal array in die Hilfe ein.
Worauf genau läuft das ganze denn hinaus?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 17:21
was arrays sind weiß ich (ich arbeite anauernt mit denen)
also einlesen funktioniert jetzt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; i2: Byte; itemp : string; Datei: TFileStream; begin if OpenDialog1.Execute then begin Datei := TFileStream.Create(Opendialog1.FileName, fmOpenRead); try for i := 1 to Datei.Size do begin Datei.ReadBuffer(i2, SizeOf(i2)); itemp := itemp+IntToStr(i2); uebergabe := itemp; end; finally Datei.Free; richedit1.Text:=itemp;
end; end; end; |
habs getestet, jetzt fehlt nurnoch das speichern xD
so hab ichs versucht... geht nicht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if SaveDialog1.Execute then begin
datei := TFileStream.Create(Savedialog1.FileName, fmCreate); datei.Write(strtoint(itemp), sizeof(strtoint(itemp));
datei.Free;
end; |
Weiß jemand wie ich das dann speichern kann, am besten wieder byte für byte...
|
|
Georg08 
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Mo 11.05.09 19:10
Edit:
Ich habe folgenden neuen Code, der fast funktioniert (eine gewisse forlde von bytes wird immer wieder in die datei geschrieben...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if SaveDialog1.Execute then begin datei := TFileStream.Create(Savedialog1.FileName, fmCreate);
for i := 1 to Sizeof(uebergabe[2]) do begin datei.Write(i2, sizeof(i2)); end;
datei.Free;
end; |
sorry doppelpost wie kann man beiträge löschen?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 11.05.09 19:17
Was hat denn das für einen Sinn die Datei in 1 Byte Stücke zu zerhacken, diese dann auch noch extrem langsam in einen String umzuwandeln und dann das wieder in Bytes umwandeln und unverändert wieder zu speichern? Dann kannst du das ganze auch direkt kopieren...
Und wenn du etwas bearbeiten willst, dann benutze dafür keine Strings im Speicher, sondern die Daten direkt...
|
|