Autor Beitrag
Georg08
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :nixweiss:

Wenn du die ganze Datei lesen willst, musst du das in einer Schleife machen.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 11.05.09 16:29 
for geht doch gut, die Größe des Streams steht ja in DeinStream.Size drin.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 :roll: ), 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 16:32 
also dann
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 11.05.09 16:41 
Hoppla, ist mir gar nicht aufgefallen:

user profile iconGeorg08 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 user profile iconjaenicke 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 :mrgreen: :autsch:

Edit 2: Ach ne, die dritte Markierung war ja ein Bugfix von dir, das stimmt ja so :oops:


Zuletzt bearbeitet von Yogu am Mo 11.05.09 16:45, insgesamt 2-mal bearbeitet
Georg08 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 16:43 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 17:03 
und wenn ich jetzt
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 17:14 
xD ups also in eine stringvariable?!
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: Mo 11.05.09 17:21 
was arrays sind weiß ich (ich arbeite anauernt mit denen)
also einlesen funktioniert jetzt:
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:
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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 155
Erhaltene Danke: 6

Win XP
Delphi 7.0 Personal
BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...