• ベストアンサー

VC++にてCString型のフルパスをfopenする

VC++(VisualStudio2005)にてCString型のフルパスをfopenしたいと思っています。 他ページでは char *name = new char[filepass.GetLength()+1]; strcpy( name, filepass ); でstrcpyでCstring→charへ変換できるとあったのですが、 'strcpy' : 2 番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 というエラーをはいて実行できませんでした。 lstrcpy(name, filepass)でも 1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 となりました。 何か良い方法をご存じないですか? char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

CStringはTCHARベースで文字列を持ちます。 よって、CStringからキャストして取得できるのはLPCTSTR型の値、 GetBuffer(SetLenght)メソッドで取得できるのはLPTSTR型の値です。 ここで、TCHARはコンパイルオプションによって、 char型あるいはwchar_t型になります。 VC++2005以降ではデフォルトでwchar_tになるようになっています。 つまり LPCTSTR型 は LPCWSTR型に、 LPTSTR型 は LPWSTR型 になります。 ここで、fopen関数は const char* 型 つまり LPCSTR型 を引数に取ります。 よって、CStringの変数を指定しても、LPCSTR型の値を取得することができないためコンパイルエラーになります。 解決方法としては、 a. const char*型を欲するfopen関数ではなく、const TCHAR*型を欲する _tfopen関数を使う。 b. コンパイルオプションをTCHAR→charになるようにする。 のどちらかでしょう。 もっとも、MFCならCFile,CStdioFileあたりのクラスを使うほうが使い勝手が良いでしょうけど。

seagal07
質問者

お礼

_tfopenを使用することで解決できました。 どうも、ありがとうございました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

LPWSTRに関しては VC.NET2005から規定の文字コードセットが『Unicode』に変更されているので wchar_t型を使う方向に修正するか もしくは プロジェクトの設定を『マルチバイト文字を使用する』に変更するかのいずれかです プロジェクト > プロジェクトのプロパティで 構成プロパティ > 全般 > 文字セット で変更可能です strcpy/_mbscpy/wcscpyにCString型をソースに使うのであれば GetBuffer/ReleaseBufferを使います _tcscpy( name, (TCHAR*)filepass.GetBuffer() ); filepass.ReleaseBuffer(); といった具合にします _tcscpyは strcpy,_mbscpyまたはwcscpyをプロジェクトの設定により吸収するためのマクロ定義です MFCで行うなら CFileなどを使った方が型変換なども

seagal07
質問者

お礼

こちらの方法でも出来ましたが、 ANo.3の方の_tfopneを使用したほうがすっきりしたので、そちらを使用させていただきました。 ご解答ありがとうございました。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。 なぜ fopen() なのでしょうか? CFile::Open() を使えばよいのではないでしょうか?

seagal07
質問者

補足

自分もCFile::Open()を使うことは考えたのですが、 プログラム中に使用しているサンプルプログラムにfopen()が使用されており、 しかもそのプログラムが難しくて自分では改変できないため、fopen()で出来ればよいと思いました。 説明不足で申し訳ありませんでした。

関連するQ&A