Autor Beitrag
Hendi48
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 271



BeitragVerfasst: Mi 07.05.08 18:02 
Hallo, ich habe folgenden C++ Code:

ausblenden C#-Quelltext
1:
2:
3:
  unsigned char ret;
  fread(&ret, 1, 1, m_fileIn);
  return ret;


Den Code möchte ich gerne nach Delphi übersetzen. m_fileIn ist eine Datei die mit fopen geöffnet wurde, aber ich weiß nicht was genau fread in Delphi ist. Info: Es werden sehr große Dateien geöffnet (bis zu 400 MB), vielleicht hilft es ja für die Auswahl der richtigen Methode in Delphi.

Gruß,
Hendi

Moderiert von user profile iconNarses: Code- durch C#-Tags ersetzt
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 07.05.08 18:29 
Wenn ich den C++-Code richtig verstanden habe, wird einfach das erste Zeichen aus der Datei ausgelesen und als char zurückgegeben. Also ich würde nen TFileStream öffnen, mit Read dann das Zeichen auslesen und zurückgeben.
Hendi48 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 271



BeitragVerfasst: Mi 07.05.08 18:48 
OK, Danke. Ich hätte eigentlich auch FS genommen, aber ich dachte von der Effizienz her gibt es vielleicht etwas besseres.

Edit: Habe noch ein Problem: Es wird jetzt folgendes gemacht:

ausblenden C#-Quelltext
1:
2:
  m_iFileSize = GetInt();
  m_iFileSize += GetInt() * INT_MAX;


GetInt() sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
int MyFile::GetInt()
{
  if(!m_fileIn)
    return 0;

  long int ret;
  fread(&ret, 4, 1, m_fileIn);
  return (int)ret;
}


das habe ich so übersetzt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function GetInt: Integer;
begin
  if FS = nil then
    Result := 0;
  
  //fread(&ret, 4, 1, m_fileIn);  // Die 4 bedeutet 32 Bits (4 Bytes), das entspricht einem Integer
  FS.Read(Result, 1);  
end;


Den oben genannten Code führe ich also so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  iFileSize: Integer;
begin
  iFileSize := GetInt;
  iFileSize := iFileSize + GetInt * MAXINT;
end;


Nur kann das irgendwie nicht stimmen, weil irgendwas mit -20253642 raus kommt. Hat INT_MAX in C++ einen anderern Wert als MAXINT in Delphi?

Edit2: Jetz hab ichs:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function GetInt: Integer;
var
  Byte1, Byte2, Byte3, Byte4: Byte;
begin
  if WZ = nil then
    Result := 0;

  Byte1 := GetByte;
  Byte2 := GetByte;
  Byte3 := GetByte;
  Byte4 := GetByte;

  Result := (byte4 shl 24) + (byte3 shl 16) + (byte2 shl 8) + byte1;
end;


Moderiert von user profile iconNarses: Code- durch C#-Tags ersetzt
arj
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: Do 08.05.08 14:11 
Deine erste Version von GetInt hätte vermutlich funktioniert,
wenn Du eine Länge von 4 gelesen hättest ;) Hast ja extra noch im Kommentar angegeben!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function GetInt: Integer;
begin
  if FS = nil then
    Result := 0;
  
  //fread(&ret, 4, 1, m_fileIn);  // Die 4 bedeutet 32 Bits (4 Bytes), das entspricht einem Integer
  FS.Read(Result, 4);  
end;