32-битная Windows и ограничение размера файла 2 ГБ (C с fseek и ftell)

Я пытаюсь перенести небольшую программу анализа данных с 64-битной UNIX на 32-битную систему Windows XP (не спрашивайте :)). Но теперь у меня проблемы с ограничением размера файла 2 ГБ (долго не 64-битный на этой платформе).

Я искал этот сайт и другие на предмет возможных решений, но не могу найти ничего, что можно было бы напрямую перевести на мою проблему. Проблема в использовании fseek и ftell.

Кто-нибудь знает модификацию следующих двух функций, чтобы они работали на 32-битной Windows XP для файлов размером более 2 ГБ (на самом деле порядка 100 ГБ).

Важно, чтобы возвращаемый тип nsamples представлял собой 64-битное целое число (возможно, 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;
}

а также

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

Я попытался использовать _fseeki64 и _ftelli64, используя следующие для замены nsamples:

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

для файла4815060992 байта я получил260046848 образцы (например,_ftelli64 дает520093696 байт), что странно.

Любопытно, когда я опускаю(__int64) бросить вызов_fseeki64 Я получаю ошибку во время выполнения (неверный аргумент).

Есть идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос