TCHARファイル名とstd::ostream – プログラミング – Home

TCHARファイル名とstd::ost...
 
通知
すべてクリア

[解決済] TCHARファイル名とstd::ostream


谷岡
 谷岡
(@谷岡)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

はじめまして,谷岡と申します。

開発環境は 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インターフェースで
書き込み処理をする簡単な方法はないでしょうか?


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> TCHARファイル名のファイルをオープンしてstd::ostreamインターフェースで
> 書き込み処理をする簡単な方法はないでしょうか?

無いです。
元々,標準にはfopenしか存在しません。wfopenなんてのは存在しないのです。

というわけで,const wchar_t *も扱いたいなら,
wcstombsやstd::codecvtなどを使って変換してやると良いでしょう。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

TCHARからchar*への変換マクロを使えば、
#ifdef _UNICODE だらけにならずに記述可能です。

#include <afxpriv.h>

void DoExport(const TCHAR* filename)
{
USES_CONVERSION;
const char* p = T2A(filename);
...
}

MSDN「テクニカル ノート 59: MFC の MBCS/Unicode 変換マクロの使用」
を参照してください。


返信引用
谷岡
 谷岡
(@谷岡)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

YuOさん,dairygoodsさん,ありがとうございます。

void f() {
const wchar_t fname[] = {0xc548,0xb155,0xd558,0xc138,0xc694,0};
_wfopen( fname, Lwb );
}
でハングル文字のファイル名が作成されますが,fnameをwcstombs()で変換すると
失敗コードが返されます。ファイル名はいろいろな国の文字が混在している可能性が
あるのでMBSへの変換では問題があるように思います。

やはり,_tfopenを使ってstd::filebufとほとんど同じものを自分で実装する
しかないのでしょうか?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> やはり,_tfopenを使ってstd::filebufとほとんど同じものを自分で実装する
> しかないのでしょうか?

std::basic_filebufだけではだめです。
std::basic_(i)(o)fstreamの代わりも必要です。

一応,どれもテンプレートクラスなのでcopy&pasteしていじればなんとかなると思いますよ。


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
 

Unicodeは使ったことがないのでわからないのですが
Tempフォルダとかに別名コピーして読み込んではどうでしょう?


返信引用
谷岡
 谷岡
(@谷岡)
ゲスト
結合: 23年前
投稿: 33
Topic starter  

YuOさん,初心者さん,ありがとうございました。

英数字名でテンポラリファイルを作ってから_wrename()でファイル名を変更する
という方法には気づきませんでした。しかも,この方法は上書き保存時に例外が
発生しても元のファイルが失われる可能性が少なくなります。

ご協力ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました