まず、setlocaleしる。

> mbstowcs(const_cast<wchar_t*>( &tmp[0] ),c,size);
> *(static_cast<volatile wchar_t*>( &tmp[0] )+size) = L'\0';
ここのキャストは要らないと思うんだけど。
 mbstowcs(&tmp[0],c,size);
 tmp.back() = L'\0';
これでいいはず。

んで、試してみたけど。
 wcout << &tmp[0] << endl;// 「圭」
 wcout << S.str() << endl;// 「圭」
 wcout << data << endl;// なにもでない

> S >> data
こいつがうまくいかないみたい。
原因は追いきれなかった。