Я пытаюсь перенести небольшую программу анализа данных из 64-разрядной UNIX в 32-разрядную систему Windows XP (не спрашивайте :)). Но теперь у меня проблемы с ограничением размера файла 2 ГБ (длинный не 64 бит на этой платформе).32-разрядная версия Windows и ограничение размера файла 2GB (C с fseek и ftell)
Я искал этот сайт и другие возможности для возможных решений, но не могу найти то, что напрямую можно перевести на мою проблему. Проблема заключается в использовании 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("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;
}
для файла 4815060992 байт я получаю образцы (например _ftelli64
дает байт), что странно.
Любопытно, когда я оставляю (__int64)
при вызове _fseeki64
Получаю ошибку времени выполнения (неверный аргумент).
Любые идеи?
- это Win32 API вариант? – 2010-10-23 10:01:29
Какой компилятор вы используете? НКУ? Визуальный (что-то)? Что-то другое? –
Я использую MinGW («не могу» использовать VS, поскольку функции, которые я пишу, являются частью модуля расширения f2py Python). Win32 API может быть вариантом, если его можно легко интегрировать в эту функцию, не добавляя к многим зависимостям (как вы, вероятно, можете сказать, что я не знаком с Windows :)) –