Autor Beitrag
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 03.05.05 10:20 
Ich arbeite momentan an einem kleinen Projekt und habe leider schon das erste Problem beim Speichern. Als Beispiel habe ich eine Textdatei genommen in der nur ein a steht. Auslesen tut er auch den Wert 97 (=a). Aber er speichert es falsch ab, da der hier farbig mackierte Teil irgendein falsches Ergebnis zurückgibt. Bei 97 ergibt der Vergleich 1>0 false, dafür aber bei 159 wahr (0>0) :grubel: . Ich habe es auch schon mit not versucht, funktioniert aber auch nicht. Weiß einer von euch, wie man das umgehen kann, oder wo der Fehler liegt?

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
procedure Kompression(const DateiFileStream: TFileStream; FileStr: String);
var i: Cardinal;
    SignCounter: array[0..255of Cardinal;
    ReadBuffer: array[0..511of Byte;
    ReadSize: Word;
    TakeSign: array of Byte;
    KompFileStream: TfileStream;
begin
 for i:=0 to 255 do
  begin
   SignCounter[i]:=0;
  end;
 while DateiFileStream.Position<DateiFileStream.Size do
  begin
   ReadSize:=DateiFileStream.Read(ReadBuffer[0], 512);
   for i:=0 to ReadSize-1 do
    begin
     inc(SignCounter[ReadBuffer[i]])
    end
  end;
 KompFileStream:=TFileStream.Create(Copy(FileStr, 1, length(FileStr)-length(ExtractFileExt(FileStr)))+'.pck', fmCreate or fmOpenWrite or fmShareDenyWrite);
 for i:=0 to 255 do
  begin
   if not (SignCounter[i]=0then //if SignCounter[i]>0 then
    begin
     SetLength(TakeSign, High(TakeSign)+2);
     TakeSign[High(TakeSign)]:=SignCounter[i];
     KompFileStream.Write(SignCounter[i], SizeOf(SignCounter[i]))
    end
  end;
 FreeAndNil(KompFileStream)
end;

procedure TForm1.Button1Click(Sender: TObject);
var DateiFileStream: TFileStream;
    OpenDialog: TOpenDialog;
begin
 OpenDialog:=TOpenDialog.Create(Self);
 if OpenDialog.Execute then
  begin
   DateiFileStream:=TFileStream.Create(OpenDialog.FileName, fmOpenRead or fmShareDenyWrite);
   if DateiFileStream.Size<=4294967295 then
    begin
     Kompression(DateiFileStream, OpenDialog.FileName);
    end
   else
    begin
     Application.MessageBox('Die ausgewählte Datei ist für diese Version zu groß!''Datei zu Groß'16)
    end;
   FreeAndNil(DateiFileStream);
  end
end;
Heiko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Di 03.05.05 10:53 
OK, ich habe den Fehler gefuden. Der Quelltext muss so heißen:

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure Kompression(const DateiFileStream: TFileStream; FileStr: String);
var i: Cardinal;
    j: Byte;
    SignCounter: array[0..255of Cardinal;
    ReadBuffer: array[0..511of Byte;
    ReadSize: Word;
    TakeSign: array of Byte;
    KompFileStream: TfileStream;
begin
 for j:=0 to 255 do
  begin
   SignCounter[j]:=0;
  end;
 while DateiFileStream.Position<DateiFileStream.Size do
  begin
   ReadSize:=DateiFileStream.Read(ReadBuffer[0], 512);
   for i:=0 to ReadSize-1 do
    begin
     inc(SignCounter[ReadBuffer[i]])
    end
  end;
 KompFileStream:=TFileStream.Create(Copy(FileStr, 1, length(FileStr)-length(ExtractFileExt(FileStr)))+'.pck', fmCreate or fmOpenWrite or fmShareDenyWrite);
 for j:=0 to 255 do
  begin
   if 0<SignCounter[j] then
    begin
     SetLength(TakeSign, High(TakeSign)+2);
     TakeSign[High(TakeSign)]:=SignCounter[i];
     KompFileStream.Write(j1)
    end
  end;
 FreeAndNil(KompFileStream);
end;


Das hat nicht einmal mein Infolehrer gefunden!

PS: Hat jemand überhaupt einen Infolehrer der Ahnung hat?