Еще есть вариант такой: проходим файл 2 раза, на первом проходе ищем максимальное количество заглавных букв(maxUppers), содержащихся в словах (просто число!), а на втором — выводим слова, содержащие найденное количество указанных букв. Как встречаем такое слово, так сразу и выводим
Примерно так.
Есть разные направления оптимизации: так, слова могут быть длинными (ну, когда ту же задачу не к словам применять, а к гигабайтным файлам, например), поэтому считать число букв дважды может быть плохим решением, и эффективнее будет в отдельный массив/файл для каждого слова посчитать число заглавных букв в нём, найти максимум по массиву (можно и в тот же проход), потом новым проходом печатаем все слова, у которых счётчики нужное число насчитали. Но для начала можно и так, двумя полными проходами.
Да, можно и в 1 проход всё сделать, с массивом. Только это уже не совсем чистый массив будет, т.к. заранее неизвестно, сколько там слов понадобится хранить. std::deque хорошо подойдёт, а большего не скажу. Можно записывать туда как сами слова, так и позиции, где они в файле находятся (ftell в помощь).
В вашем полу-рабочем варианте осталось сделать fseek в начало файла и повторить цикл чтения с токенизацией, только уже выводя все слова, у которых заглавных ровно maxUppers штук.
upd. А вот с указателями как-то вольно очень обращаетесь. И в strtok ерунда какая-то передаётся, и в maxWord ерунда будет при невозможности за раз прочитать весь файл (буфера не хватит если), и читать так из файла не стоит. В любом случае, с указателями советую разобраться - или не трогать их вообще, а работать с более безопасными типами. И из файла читать посимвольно, а то у вас в задании разделители - "любые символы", а в коде только перевод строки и каретки, так нельзя.