はじめまして,谷岡と申します。
開発環境は Windows 2000, VC6.0, MFC未使用 です。
DoExport(const TCHAR* filename) という仮想関数内でファイル保存の
プログラムを作成しています。ファイル名の文字の型がTCHARなので
_tfopenマクロでファイルをオープンしてから,ANSI Cのファイルストリーム
関数群で書き込み処理をできます。
しかし,標準C++のstd::ostreamインターフェースの方が使い慣れているので
こちらで書き込み処理をしようと考えています。
しかし,std::basic_ofstream や std::basic_filebuf のファイル名の文字は
char型に固定なのでこれらでファイルをオープンすることはできません。
また,_tfopenマクロとstd::streambufを使って新しいストリームバッファの
クラスを作成することは可能だと思いますが,深い知識がないのでできません。
TCHARファイル名のファイルをオープンしてstd::ostreamインターフェースで
書き込み処理をする簡単な方法はないでしょうか?
> TCHARファイル名のファイルをオープンしてstd::ostreamインターフェースで
> 書き込み処理をする簡単な方法はないでしょうか?
無いです。
元々,標準にはfopenしか存在しません。wfopenなんてのは存在しないのです。
というわけで,const wchar_t *も扱いたいなら,
wcstombsやstd::codecvtなどを使って変換してやると良いでしょう。
TCHARからchar*への変換マクロを使えば、
#ifdef _UNICODE だらけにならずに記述可能です。
#include <afxpriv.h>
void DoExport(const TCHAR* filename)
{
USES_CONVERSION;
const char* p = T2A(filename);
...
}
MSDN「テクニカル ノート 59: MFC の MBCS/Unicode 変換マクロの使用」
を参照してください。
YuOさん,dairygoodsさん,ありがとうございます。
void f() {
const wchar_t fname[] = {0xc548,0xb155,0xd558,0xc138,0xc694,0};
_wfopen( fname, Lwb );
}
でハングル文字のファイル名が作成されますが,fnameをwcstombs()で変換すると
失敗コードが返されます。ファイル名はいろいろな国の文字が混在している可能性が
あるのでMBSへの変換では問題があるように思います。
やはり,_tfopenを使ってstd::filebufとほとんど同じものを自分で実装する
しかないのでしょうか?
> やはり,_tfopenを使ってstd::filebufとほとんど同じものを自分で実装する
> しかないのでしょうか?
std::basic_filebufだけではだめです。
std::basic_(i)(o)fstreamの代わりも必要です。
一応,どれもテンプレートクラスなのでcopy&pasteしていじればなんとかなると思いますよ。
Unicodeは使ったことがないのでわからないのですが
Tempフォルダとかに別名コピーして読み込んではどうでしょう?
YuOさん,初心者さん,ありがとうございました。
英数字名でテンポラリファイルを作ってから_wrename()でファイル名を変更する
という方法には気づきませんでした。しかも,この方法は上書き保存時に例外が
発生しても元のファイルが失われる可能性が少なくなります。
ご協力ありがとうございました。