32-bit-Windows und die 2 GB Grenze für die Dateigröße (C mit fseek und ftell)

Ich bin versucht, port einen small-data-Analyse-Programm aus einer 64-bit-UNIX zu einem 32-bit-Windows-XP-system (nicht Fragen :)).
Aber nun habe ich Probleme mit der 2 GB Grenze für die Dateigröße (lange nicht 64 bit auf dieser Plattform).

Habe ich danach gesucht, dieser website und anderen für möglich sollutions aber finde keine, die direkt übersetzbar zu meinem problem.
Das problem ist in der Verwendung von fseek und ftell.

Kennt jemand eine änderung an den beiden folgenden Funktionen, um Sie arbeiten auf 32-bit-Windows XP für Dateien, die größer als 2 GB (eigentlich um 100GB).

Ist es wichtig, dass der Rückgabetyp von nsamples ist ein 64-bit-integer (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;
}

und

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);
}

Versuchte ich mit _fseeki64 und _ftelli64 mit den folgenden zu ersetzen nsamples:

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

  /* Open file */
  fp = fopen(filename, "rb");
  if (fp == NULL)
  {
    perror("Error: 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 4815060992 bytes bekomme ich 260046848 Proben (z.B. _ftelli64 gibt 520093696 bytes) das ist seltsam.

Neugierig, wenn ich die (__int64) cast in dem Aufruf von _fseeki64 bekomme ich einen Laufzeit-Fehler (ungültiges argument).

Irgendwelche Ideen?

ist die Win32-API eine option?
Welchen compiler benutzt du? gcc? Visual (etwas)? Etwas anderes?
Ich bin mit MinGW ("kann nicht" VS da die Funktionen, die ich Schreibe, sind Teil eines f2py Python extension module). Die Win32-API könnte eine option sein, wenn es könnte leicht integriert werden in diese Funktion, ohne Zugabe zu viele Abhängigkeiten (wie Sie wahrscheinlich sagen, ich bin nicht so vertraut mit Windows :))
Ich habe eine speziellere Frage, wie auch, wenn, die wird beantwortet, werde ich die endgültige Lösung hier auch.

InformationsquelleAutor Pim Schellart | 2010-10-23

Schreibe einen Kommentar