while (!whatever.eof())
по сути всегда неверно и никогда не будет правильно определять конец файла.В вашем случае проще всего объединить чтения вместе, а затем выполнить всю обработку, примерно так:
while (fin >> arr >> a >> b >> N) {
PrintBackwards(arr);
fout << "\n";
fout << gcd(a, b) << "\n";
fout << PrimeFactor(N) << "\n";
}
Важнейшей частью является проверка результата чтения, а не проверка и чтение по отдельности.друг от друга.
Еще пара советов: я бы использовал std::string
вместо массива.Я бы также отделил обращение строки от печати, чтобы вы могли получить что-то вроде:
fout << reverse(arr) << "\n"
<< gcd(a, b) << "\n"
<< PrimeFactor(N) << "\n";
Подчеркивая общность операций, как правило, хорошо.
Редактировать: ПростоРади интереса, я укажу другой способ, которым вы могли бы делать вещи, если хотите.Поскольку вы в основном читаете и обрабатываете четыре элемента как группу, вы можете сделать эту группировку немного более явной:
struct item {
std::string arr;
int a, b, N;
friend std::istream &operator>>(std::istream &is, item &i) {
return is >> arr >> a >> b >> N;
}
};
struct process {
std::string operator()(item const &i) {
std::ostringstream buffer;
buffer << reverse(arr) << "\n" << gcd(a, b) << "\n" << PrimeFactor(N);
return buffer.str();
}
}
Таким образом, вы можете позволить стандартной библиотеке обрабатывать все деталичтение и запись, проверка конца файла и т. д .: * 10101
std::transform(std::istream_iterator<item>(fin),
std::istream_iterator<item>(),
std::ostream_iterator<std::string>(std::cout, "\n"),
process());