Первое наблюдение: вы перебираете границы массива:
int digits[20];
for (int i = 0; i <= 20; i++)
20 элементов и 21 итерация. Это неопределенное поведение, так что все возможно здесь (если ваша программа в конечном итоге попадет сюда).
Далее, вы читаете из файла один раз, а затем у вас есть бесконечный цикл, потому что выражение !file1.eof()
либо истинно, либоfalse для остальной части программы. Разве это не причина «остановки вывода»?
Третий вывод: ваши if
операторы бесполезны из-за точки с запятой после оператора:
if(('0' <= contents && contents <= '9') && ('0' >= contents+1 && contents+1 > '9'));
digits[n]=contents;
Вы просто присваиваете digits[n]=contents;
без каких-либо проверок.
Я также не вижу причин для указания ссылки на char в функции. Почему бы не сделать его локальной переменной?