32 bits de Windows et le fichier de 2 go de limite de taille (C avec fseek et ftell)

Je tente de port une petite analyse des données du programme à partir d'un UNIX 64 bits à 32 bits de Windows XP (ne demandez pas :)).
Mais maintenant, je vais avoir des problèmes avec les 2 go de limite de taille de fichier (longue de ne pas être en 64 bits sur cette plate-forme).

J'ai cherché sur ce site et les autres pour possible sollutions, mais ne trouvez pas tout qui sont directement traduisible à mon problème.
Le problème est dans l'utilisation de fseek et ftell.

Personne ne sait d'une modification à l'une des deux fonctions suivantes pour les faire travailler sur la 32 bits de Windows XP pour les fichiers supérieurs à 2 GO (en fait de l'ordre de 100 go).

Il est essentiel que le type de retour de nsamples est un entier de 64 bits (éventuellement 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;
}

et

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

J'ai essayé d'utiliser _fseeki64 et _ftelli64 à l'aide de la suivante pour remplacer 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;
}

pour un fichier de 4815060992 octets - je obtenir 260046848 des échantillons (p. ex. _ftelli64 donne 520093696 octets) qui est étrange.

Curieusement lorsque je quitte le (__int64) exprimés dans l'appel à _fseeki64 j'obtiens une erreur à l'exécution (argument non valide).

Des idées?

est API Win32 une option?
Quel compilateur que vous utilisez? gcc? Visuel (quelque chose)? Quelque chose d'autre?
J'utilise MinGW ("ne peut pas" utiliser VS depuis les fonctions, je suis en train d'écrire font partie d'un f2py Python module d'extension). L'API Win32 pourrait être une option si elle pouvait être facilement intégré dans cette fonction sans ajouter de nombreuses dépendances (comme vous pouvez probablement dire que je ne suis pas familier avec Windows :))
J'ai posté une question plus spécifique, si répondu, je vais ajouter la solution finale.

OriginalL'auteur Pim Schellart | 2010-10-23