Похоже, ваш компилятор пытается предотвратить переполнение, ограничивая fscanf 16-битами.
Какой компилятор (и версию) и какую операционную систему вы используете?32 или 64 бита?
Кроме того, что возвращает fscanf?
(Проверьте это, изменив эту строку:
fscanf(ip,"%ld ",&c);
на эти строки:)
int rv;
rv = fscanf(ip,"%ld ",&c);
printf("fscanf() returned: %d\n", rv);
Примечание. Я не могу комментировать приведенный выше ответ (недостаточно репутации), но в некоторых компиляторах 't' явно указывает, что файл является текстовым файлом.
Обновление : эта функция должна анализировать длинные символы за символом.См. Мой комментарий об использовании этого.
int fparselong(FILE * fp, long * ip)
{
int parsed = 0;
*ip = 0;
int c;
while((c = fgetc(fp)) != EOF)
{
// c is newline, return 0 if nothing has been parsed, 1 if something has
if(c == '\n'){ return parsed; }
// check for oob
if(c < '0' || c > '9'){ return -1; }
// Update ip
*ip = *ip * 10 + (c - '0');
// Something has been parsed
parsed = 1;
}
// EOF received
return -2;
}
Так что вместо:
fscanf(ip,"%ld ",&c);
Вы бы получили:
fparselong(ip, &c);
Опять же, если это сработает, донаНе используйте его, но найдите другой компилятор.Если это не так, это означает, что в вашем файле появляется неожиданный символ.Вы можете hexdump ваш входной файл или использовать другие способы определения этого.