Проблемма в следующем....
Return Value
Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf and fwscanf.
Если ни одного поля не было заполнено и не возникло ошибки в потоке то fscanf должна вернуть 0 и сдвинуть указатель файла на новую строку. Но указатель файла не сдвигается, мало того он после этого случая не сдвигается вообще дальнейшими fscanfами. соотвественно EOF'a не будет никогда. В мсдн про данную вещь умалкивают...
Вот как проверял
Содержимое файла 1.txt
123
4
5
f
5
7
когда fscanf доходит до строки "f", то всё, дальше указатель файла двигать он отказывается... можно конечно для этого использовать fgets - вообще глупо, создавать строковый буфер, только для того чтобы сдвинуть указатель файла... данные fscanf ведь прочитал, поэтому и указатель сдвинуть должен, а не хочет...
Пишу вот так
int res;
while ((res=fscanf(f1,"%d",&a))!=EOF)
{
if (res>0)
s+=a;
}