Даже если вы говорите, что у вас "нулевой" интерес к использованию вызовов "win32", в таких ситуациях вы застряли между молотом и наковальней.
Я бы просто реализовал свою собственную версию файла iostream, используя вызовы "win32", которые выглядят как интерфейсы fstream. Это легко сделать, и я делал это сотни раз.
Назовите это, скажем, «fstreamwin32».
Тогда у меня будет заголовочный файл, который будет делать что-то вроде:
#ifdef WIN32
typedef fstreamwin32 fsteamnative;
#else
typedef fstream fsteamnative;
#endif
Тогда я бы везде использовал fsteamnative. Таким образом, вы сохраняете свой код кроссплатформенным и все еще решаете свою проблему.
Если проблема когда-либо будет устранена, вы можете легко удалить обходной путь «win32», вернув обратно typedef, используя fstream typedef. Вот почему многие кроссплатформенные кодовые базы имеют много уровней косвенности (например, используя свои собственные typedef для стандартных вещей), так что они делают такие вещи, как если бы пришлось менять большое количество кода.