Eu creio que não seja alguma modificação no fstream e sim na string de texto.
o fstream apenas pega o que foi passado e salva. Como seu sistema trabalha com unicode, todos os acentos que você digitar estarão no formato unicode mas isso não impede que você escreva algo em latin. Você pode por exemplo usar o iconv para converter textos unicodde para latin1 no terminal.
Ex.:
echo "Coração" | iconv -f utf8 -t iso8859-1 > teste.txt
dê um cat no teste.txt
cat teste.txt
e você verá que tem uma interrogação no lugar do acento. Isso porque o texto está armazenado no formato latin1 e o cat não soube fazer a conversão para unicode antes de exibir na tela.
Obs.: Se você abrir o arquivo usando o gedit, verás que está tudo ok com os acentos. Isso porque o gedit verificou que o charset do arquivo era latin1 e por isso foi exibido corretamente.
A solução que eu tenho em mente é você percorrer caractere por caractere no texto que vai ser armazenado no arquivo e fazer a conversão
Tente ver o código fonte do iconv que lá deve ter como ele faz essa conversão
Acredito que existam bibliotecas para c que façam esse tipo de conversão
Outra coisa que você poderia fazer (no caso de estar gravando arquivos de texto) é após usar o programa, converter o charset usando o iconv.
Ex.: iconv -f utf8 -t iso8859-1 arquivo.txt --output arquivo.txt.aux && rm arquivo.txt && mv arquivo.txt.aux arquivo.txt
Pode ser que exista uma solução mais simples mas eu desconheço. Pode ser até que a própria biblioteca padrão do C tenha algo para converter e eu não saiba. Mas as dicas estão dadas