32-Bit-Windows und die Dateigrößenbeschränkung von 2 GB (C mit fseek und ftell)

Ich versuche, ein kleines Datenanalyseprogramm von einem 64-Bit-UNIX auf ein 32-Bit-Windows XP-System zu portieren (nicht fragen :)). Aber jetzt habe ich Probleme mit der Dateigrößenbeschränkung von 2 GB (auf dieser Plattform sind es schon lange keine 64-Bit-Dateien).

Ich habe diese Website und andere nach möglichen Lösungen durchsucht, kann aber keine finden, die direkt auf mein Problem übersetzbar sind. Das Problem liegt in der Verwendung von fseek und ftell.

Weiß jemand von einer Änderung der folgenden beiden Funktionen, damit sie unter 32-Bit-Windows XP für Dateien mit mehr als 2 GB funktionieren (tatsächlich 100 GB bestellen).

Es ist wichtig, dass der Rückgabetyp von nsamples eine 64-Bit-Ganzzahl ist (möglicherweise int64_t).

long nsamples(char* filename)
{
  FILE *fp;
  long n;

  /* Open file */
  fp = fopen(filename, "rb");

  /* Find end of file */
  fseek(fp, 0L, SEEK_END);

  /* Get number of samples */
  n = ftell(fp) / sizeof(short);

  /* Close file */
  fclose(fp);

  /* Return number of samples in file */
  return n;
}

un

void readdata(char* filename, short* data, long start, int n)
{
  FILE *fp;

  /* Open file */
  fp = fopen(filename, "rb");

  /* Skip to correct position */
  fseek(fp, start * sizeof(short), SEEK_SET);

  /* Read data */
  fread(data, sizeof(short), n, fp);

  /* Close file */
  fclose(fp);
}

Ich habe versucht, _fseeki64 und _ftelli64 zu verwenden, indem ich Folgendes verwendet habe, um nsamples zu ersetzen:

__int64 nsamples(char* filename)
{
  FILE *fp;
  __int64 n;
  int result;

  /* Open file */
  fp = fopen(filename, "rb");
  if (fp == NULL)
  {
    perror("Er,ror: could not open file!\n");
    return -1;
  }

  /* Find end of file */
  result = _fseeki64(fp, (__int64)0, SEEK_END);
  if (result)
  {
    perror("Error: fseek failed!\n");
    return result;
  }

  /* Get number of samples */
  n = _ftelli64(fp) / sizeof(short);

  printf("%I64d\n", n);

  /* Close file */
  fclose(fp);

  /* Return number of samples in file */
  return n;
}

für eine Datei von 4815060992 Bytes Ich bekomme 260046848 samples (z. B._ftelli64 gibt 520093696 bytes) was seltsam ist.

Curiously, wenn ich das @ weglas(__int64) Besetzung im Aufruf an_fseeki64 Ich erhalte einen Laufzeitfehler (ungültiges Argument).

Irgendwelche Ideen

Antworten auf die Frage(8)

Ihre Antwort auf die Frage