[Edit] Потребность в явных вызовах flush () была тем, с чем я столкнулся со старыми, сломанными, предстандартными компиляторами, такими как MSVC 6 и более ранние, более десяти лет назад.Вероятно, в этом больше нет необходимости, и, очевидно, это был обходной путь для проблемных реализаций библиотеки.
Я опробовал код (удалив раздел для вывода сообщений и переименовав имя выходного файла в мою систему).Вывод был правильным.
Возможно, стоит попытаться записать в локальный файл, просто чтобы посмотреть, что произойдет.Вы уже проверяете, не удалось ли открыть файловый поток для вывода, но в вашем случае происходит что-то странное.
[Редактировать: Я, вероятно, получу отрицательный голос за то, что был любопытнымно ...] Ваши привычки в стиле C определять все переменные в верхней части данной области видимости устарели.Попробуйте определить переменные не раньше, чем там, где они могут быть правильно инициализированы и имеют более ограниченную область видимости.Сейчас это может не иметь большого значения, но если вы когда-нибудь работаете в системе C любого разумного масштаба и столкнетесь с первыми ошибками неинициализированных переменных, вы начнете презирать ее.Каждый имеет право на свои личные предпочтения, но стиль, способствующий ошибкам, объективно, объективно говоря.